#!/usr/bin/env bash
set -euo pipefail

REAL_PATH="${BASH_SOURCE[0]}"
while [[ -L "$REAL_PATH" ]]; do
  LINK_DIR="$(cd -P "$(dirname "$REAL_PATH")" && pwd)"
  REAL_PATH="$(readlink "$REAL_PATH")"
  [[ "$REAL_PATH" != /* ]] && REAL_PATH="${LINK_DIR}/${REAL_PATH}"
done

SCRIPT_DIR="$(cd -P "$(dirname "$REAL_PATH")" && pwd)"
REPO_ROOT="$(cd -P "${SCRIPT_DIR}/../../.." && pwd)"
# shellcheck source=../../lib/runtime.sh
. "${REPO_ROOT}/scripts/lib/runtime.sh"

exec_runtime() {
  local runtime_bin
  if runtime_bin="$(find_runtime_binary)"; then
    exec "${runtime_bin}" "$@"
  fi

  if exec_repo_dev_runtime "$@"; then
    return 0
  fi

  echo "[ha-nova] No Go runtime found. Install HA NOVA first or build the CLI." >&2
  exit 1
}

case "${1:-help}" in
  setup)
    shift
    exec_runtime setup "$@"
    ;;
  doctor)
    shift
    exec_runtime doctor "$@"
    ;;
  update)
    shift
    runtime_bin="$(find_runtime_binary || true)"
    if [[ -n "${runtime_bin:-}" ]]; then
      exec "${runtime_bin}" update "$@"
    fi
    exec_runtime update "$@"
    ;;
  check-update)
    shift
    runtime_bin="$(find_runtime_binary || true)"
    if [[ -n "${runtime_bin:-}" ]]; then
      exec "${runtime_bin}" check-update "$@"
    fi
    exec_runtime check-update "$@"
    ;;
  uninstall)
    shift
    exec_runtime uninstall "$@"
    ;;
  relay)
    shift
    exec_runtime relay "$@"
    ;;
  version)
    shift
    exec_runtime version "$@"
    ;;
  dev:sync)
    exec bash "${REPO_ROOT}/scripts/dev-sync.sh"
    ;;
  -h|--help|help)
    echo "HA NOVA"
    echo ""
    echo "Usage:"
    echo "  ha-nova setup [client]"
    echo "  ha-nova doctor"
    echo "  ha-nova check-update"
    echo "  ha-nova update"
    echo "  ha-nova uninstall"
    echo "  ha-nova relay <health|ws|core|jq|version>"
    echo "  ha-nova version"
    echo "  ha-nova dev:sync"
    ;;
  *)
    exec_runtime "$@"
    ;;
esac
