#!/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 amberctl 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 amberctl disable_src -n "${disable_source}" >/dev/null 2>/dev/null || true
  fi
}

main "$@"
