#!/bin/bash
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

### register dev host as target's update source

## usage: fx add-update-source [--type=TYPE] [--name=NAME] [--disable-source=NAME]
##
## Configure target device to use a new update source.
##
## When --type is devhost (the default), configure the target to use the dev
## host's address as seen from the target fuchsia device.
##
## When --type is localhost, configure the target to use 127.0.0.1 as its
## update source.
##
## --name=NAME           Name the generated update source config NAME. Defaults to the config type.
## --disable-source=NAME Disable the update source with NAME after adding the new update source.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-config-read

function usage {
  fx-command-help add-update-source
}

function main {
  fx-standard-switches "$@"
  set -- "${FX_ARGV[@]}"

  config_type="devhost"
  port="8083"
  source_name=""
  disable_source=""
  while [[ $# -ne 0 ]]; do
    case "$1" in
      --port)
        port="$2"
        shift
        ;;
      --type)
        config_type="$2"
        shift
        ;;
      --name)
        source_name="$2"
        shift
        ;;
      --disable-source)
        disable_source="$2"
        shift
        ;;
      *)
        echo >&2 "Unrecognized option: $1"
        usage
        exit 1
    esac
    shift
  done

  if [[ -z "${source_name}" ]]; then
    source_name="${config_type}"
  fi

  local local_addr="$(fx-command-run shell 'echo $SSH_CONNECTION' | cut -d ' ' -f 1 | sed 's/%/%25/g')"
  if [[ $? -ne 0 || -z "${local_addr}" ]]; then
    echo >&2 "Unable to determine target's view of amber address.  Is the target up?"
    exit 1
  fi

  repository_dir="${FUCHSIA_BUILD_DIR}/amber-files/repository"
  if [[ ! -d "${repository_dir}" ]]; then
    echo >&2 "Amber repository does not exist.  Please build first."
    exit 1
  fi

  config_url="http://[${local_addr}]:${port}/config.json"

  if [[ "${config_type}" == "devhost" ]]; then
    repo_url="http://[${local_addr}]:${port}"
  elif [[ "${config_type}" == "localhost" ]]; then
    repo_url="http://127.0.0.1:${port}"
  else
    echo >&2 "Unknown config type. Valid options: devhost, localhost"
    exit 1
  fi

  fx-command-run shell amber_ctl add_src \
    -n "${source_name}" \
    -f "${config_url}"
  err=$?

  if [[ $err -ne 0 ]]; then
    echo >&2 "Unable to register update source."
    if [[ $err -eq 2 ]]; then
      # The GET request failed.
      echo >&2 " - Is 'fx serve' or 'fx serve-updates' running?"
      echo >&2 " - Can the target reach the development host on tcp port 8083?"
    fi
    return "$err"
  fi

  if [[ -n "${disable_source}" ]]; then
    # Best effort, don't show status or fail on error
    fx-command-run shell amber_ctl disable_src -n "${disable_source}" >/dev/null 2>/dev/null || true
  fi
}

main "$@"
