#!/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.

### start the update server and attach to a running fuchsia device
## usage: fx serve-updates [-v]
##   -v verbose (do not suppress `pm serve` output)

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read

function usage {
  fx-command-help serve-updates
}

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

verbose=false
very_verbose=false
while (($#)); do
  case "$1" in
    -v|--verbose)
      if $verbose; then
        very_verbose=true
      else
        verbose=true
      fi
      ;;
    -vv)
      verbose=true
      very_verbose=true
      ;;
    *)
      echo "Unrecognized option: $1"
      usage
      exit 1
      ;;
  esac
  shift
done

pm_srv_pid=
cleanup() {
  if [[ -n "${pm_srv_pid}" ]]; then
    if kill -0 "${pm_srv_pid}" 2> /dev/null; then
      kill -TERM "${pm_srv_pid}" 2> /dev/null
      wait "${pm_srv_pid}" 2> /dev/null
    fi
  fi
}
trap cleanup EXIT

log() {
  # This format matches bootserver so that `fx serve` ui is easier to read.
  echo "$(date '+%Y-%m-%d %H:%M:%S') [serve-updates] $@"
}

log_verbose() {
  if [[ "$very_verbose" == true ]]; then
    log "$@"
  fi
}

if [[ -z "${pm_srv_pid}" ]]; then
  serve_flags=()
  if [[ "${verbose}" != true ]]; then
    serve_flags+=("-q")
  fi
  ${FUCHSIA_BUILD_DIR}/host_x64/pm serve -d ${FUCHSIA_BUILD_DIR}/amber-files/repository ${serve_flags[@]} &
  pm_srv_pid=$!
fi

# Allow a little slack for pm serve to startup, that way the first kill -0 will catch a dead server
sleep 0.1
if ! kill -0 "${pm_srv_pid}" 2> /dev/null; then
  log "Server died, exiting"
  wait
  exit $?
fi

device_addr=$(get-fuchsia-device-addr)
update_device_addr() {
  device_addr="$(get-fuchsia-device-addr 2>/dev/null)"
}

if [[ "$(uname -s)" = "Darwin" ]]; then
  ping_device() {
    # Darwin's "ping" doesn't recognize IPv6 addresses and doesn't accept a
    # timeout parameter, which appears to default to 10 seconds.
    ping6 -c 1 "$1" >/dev/null
  }
else
  ping_device() {
    ping -c 1 -W 1 "$1" >/dev/null
  }
fi

# State is used to prevent too much output
state="discover"
while true; do
  if ! kill -0 "${pm_srv_pid}" 2> /dev/null; then
    log "Server died, exiting"
    pm_srv_pid=
    exit 1
  fi

  if [[ "$state" == "discover" || "$state" == "discover1" ]]; then
    log_verbose "Updating device address (direct) with \"$device\""
    update_device_addr
    if [[ -z "${device_addr}" ]]; then
      if [[ "${state}" != "discover1" ]]; then
        log "No device found, waiting..."
        state="discover1"
      fi
      sleep 1
      continue
    fi

    log_verbose "Ping $device_addr"
    if ping_device $device_addr; then
      log "Device up"
      state="config"
    fi

    sleep 1
  fi

  if [[ "$state" == "config" ]]; then
    log "Registering devhost as update source"
    if fx-command-run add-update-source --disable-source=localhost $device_arg; then
      log "Ready to push packages!"
      state="ready"
    else
      log "Device lost while configuring update source"
      state="discover"
    fi

    sleep 1
  fi

  if [[ "$state" == "ready" ]]; then
    log_verbose "Ping $device_addr"
    if ping_device $device_addr; then
      sleep 1
    else
      log "Device lost"
      state="discover"
    fi
  fi
done

# See EXIT trap above for cleanup that occurs
