#!/bin/bash

set -euo pipefail

. "$(dirname ${BASH_SOURCE[0]})/settings.env" || exit 1

DEFAULT_BASE_URL="${SETTING_BINPKG_SERVER_PROD}"
DEV_BOARD_URL="${DEFAULT_BASE_URL}/developer"
DEFAULT_SDK_URL="${DEFAULT_BASE_URL}/sdk"
DEV_SDK_URL="${DEFAULT_BASE_URL}/developer/sdk"
FILE=~/trunk/.repo/manifests/version.txt
FLATCAR_DEV_BUILDS_SDK=""
FLATCAR_SDK_VERSION=""
FLATCAR_DEV_BUILDS=""
FLATCAR_VERSION=""
FLATCAR_VERSION_ID=""

# To keep this script usable outside of the SDK chroot, do not include common.sh here.

if [[ $# = 0 ]] || [[ "$1" = "-h" ]] || [[ "$1" = "--help" ]]; then
  echo "Updates ${FILE} with new values to specify which binary packages to use
Usage: $0 FLAGS...
  --board-version (VERSION|BOARD/BRANCH-nightly):  Set FLATCAR_VERSION=VERSION and
                                                   FLATCAR_VERSION_ID=VERSION where VERSION can
                                                   be resolved by looking up the latest build
                                                   referenced by
                                                   ${DEV_BOARD_URL}/boards/BOARD/BRANCH-nightly.txt
                                                   where BRANCH can be flatcar-MAJOR for the maintenance
                                                   branch of a release with the version MAJOR.MINOR.PATCH,
                                                   or the Alpha/Edge development branch
  --dev-board:                                     Set FLATCAR_DEV_BUILDS=${DEV_BOARD_URL}
                                                   which also selects --dev-sdk unless you specify
                                                   --no-dev-sdk
  --no-dev-board:                                  Remove existing FLATCAR_DEV_BUILDS
  --sdk-version (VERSION|sdk-BRANCH-nightly):      Set FLATCAR_SDK_VERSION=VERSION where VERSION can
                                                   be resolved by looking up the latest SDK build
                                                   referenced by
                                                   ${DEV_BOARD_URL}/sdk/amd64/sdk-BRANCH-nightly.txt
                                                   where BRANCH is currently only main, and requires
                                                   the --dev-sdk option if --no-dev-board is used
  --dev-sdk:                                       Set FLATCAR_DEV_BUILDS_SDK=${DEV_SDK_URL}
  --no-dev-sdk:                                    Use a release SDK even if --dev-board is specified
  --file FILE:                                     Modify another file than ${FILE}, useful if run
                                                   outside of the SDK chroot. If /dev/stdout or
                                                   /dev/stderr is used, only new values are printed.
  --binhost                                        Use a custom binhost (defaults to '${DEFAULT_BASE_URL}'),
                                                   e.g., '${SETTING_BINPKG_SERVER_DEV}'.
                                                   This will update BOARD and SDK URLs accordingly.
"
  exit 1
fi

# --binhost needs to be evaluated first since it impacts other variables set below
custom_binhost="false"
for arg in "${@}" ; do
    if $custom_binhost; then
        echo "Using custom binhost '${arg}'"
        DEFAULT_BASE_URL="${arg}"
        DEV_BOARD_URL="${DEFAULT_BASE_URL}/developer"
        DEFAULT_SDK_URL="${DEFAULT_BASE_URL}/sdk"
        DEV_SDK_URL="${DEFAULT_BASE_URL}/developer/sdk"
        break
    fi
    if [ "$arg" = "--binhost" ] ; then
        custom_binhost="true"
    fi
done

while [[ $# -gt 0 ]]; do
  ARG="$1"
  shift
  case "${ARG}" in
    --binhost) # handled separately above, pass
        shift;;
    --board-version)
      VAL="$1"
      shift
      if [[ "${VAL}" == */*-nightly ]]; then
        VAL=$(curl -s -S -f -L "${DEV_BOARD_URL}/boards/${VAL}.txt")
      fi
      FLATCAR_VERSION="${VAL}"
      FLATCAR_VERSION_ID="${VAL}"
      ;;
    --dev-board)
      FLATCAR_DEV_BUILDS="${DEV_BOARD_URL}"
      ;;
    --no-dev-board)
      FLATCAR_DEV_BUILDS=no
      ;;
    --sdk-version)
      FLATCAR_SDK_VERSION="$1"
      if [[ "${FLATCAR_SDK_VERSION}" == sdk-*-nightly ]]; then
        FLATCAR_SDK_VERSION=$(curl -s -S -f -L "${DEV_BOARD_URL}/sdk/amd64/${FLATCAR_SDK_VERSION}.txt")
      fi
      shift
      ;;
    --dev-sdk)
      FLATCAR_DEV_BUILDS_SDK="${DEV_SDK_URL}"
      ;;
    --no-dev-sdk)
      FLATCAR_DEV_BUILDS_SDK="${DEFAULT_SDK_URL}"
      ;;
    --file)
      FILE="$1"
      shift
      ;;
    *)
      echo "Unkown argument ${ARG}"
      exit 1
      ;;
  esac
done

if [[ "${FILE}" != "/dev/stdout" ]] && [[ "${FILE}" != "/dev/stderr" ]]; then
  [[ -n "${FLATCAR_VERSION}" ]] && sed -i "/FLATCAR_VERSION=.*/d" "${FILE}"
  [[ -n "${FLATCAR_VERSION_ID}" ]] && sed -i "/FLATCAR_VERSION_ID=.*/d" "${FILE}"
  [[ -n "${FLATCAR_DEV_BUILDS}" ]] && sed -i "/FLATCAR_DEV_BUILDS=.*/d" "${FILE}"
  [[ -n "${FLATCAR_SDK_VERSION}" ]] && sed -i "/FLATCAR_SDK_VERSION=.*/d" "${FILE}"
  [[ -n "${FLATCAR_DEV_BUILDS_SDK}" ]] && sed -i "/FLATCAR_DEV_BUILDS_SDK=.*/d" "${FILE}"
fi

{
  [[ -n "${FLATCAR_VERSION}" ]] && echo "FLATCAR_VERSION=${FLATCAR_VERSION}"
  [[ -n "${FLATCAR_VERSION_ID}" ]] && echo "FLATCAR_VERSION_ID=${FLATCAR_VERSION_ID}"
  [[ -n "${FLATCAR_DEV_BUILDS}" ]] && [[ "${FLATCAR_DEV_BUILDS}" != no ]] && echo "FLATCAR_DEV_BUILDS=${FLATCAR_DEV_BUILDS}"
  [[ -n "${FLATCAR_SDK_VERSION}" ]] && echo "FLATCAR_SDK_VERSION=${FLATCAR_SDK_VERSION}"
  [[ -n "${FLATCAR_DEV_BUILDS_SDK}" ]] && echo "FLATCAR_DEV_BUILDS_SDK=${FLATCAR_DEV_BUILDS_SDK}"
} >> "${FILE}"
