#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "${SCRIPT_DIR}/platform-paths.sh" ]; then
	# shellcheck source=platform-paths.sh
	. "${SCRIPT_DIR}/platform-paths.sh"
else
	# shellcheck source=../../pkg/common/platform-paths.sh
	. "${SCRIPT_DIR}/../../pkg/common/platform-paths.sh"
fi
backone_resolve_paths

HOME_DIR="${BACKONE_HOME}"
STAMP="${HOME_DIR}/.installed-version"
LOG_DIR="${BACKONE_LOG_DIR:-/var/log/backone}"
LOG_FILE="${LOG_DIR}/updater.log"
MIGRATIONS="${BACKONE_ADDONS_DIR}/updater/migrations"
LEGACY_HOME="/var/lib/zerotier-one"

log() {
  mkdir -p "$LOG_DIR"
  echo "$(date -Iseconds) $*" | tee -a "$LOG_FILE"
}

read_version() {
  if [ -f "$STAMP" ]; then
    cat "$STAMP"
  else
    echo '{"package":"backone","version":"0.0.0","schemaVersion":0}'
  fi
}

write_version() {
  local version="${1:-$(cat debian/version 2>/dev/null || echo 1.15.0)}"
  mkdir -p "$HOME_DIR"
  cat > "$STAMP" <<EOF
{"package":"backone","version":"${version}","schemaVersion":2,"updatedAt":"$(date -Iseconds)"}
EOF
  chown backone:backone "$STAMP" 2>/dev/null || true
}

run_migrations() {
  local scope="${1:-all}"
  [ -d "$MIGRATIONS" ] || return 0
  for script in "$MIGRATIONS"/*; do
    [ -f "$script" ] || continue
    case "$(basename "$script")" in
      001_*)
        [ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
        ;;
      002_*)
        [ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
        ;;
      003_*)
        [ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
        ;;
      004_*|005_*)
        [ "$scope" = "all" ] || [ "$scope" = "core" ] || continue
        ;;
      *)
        if [ "$scope" != "all" ] && [ "$scope" != "$ADDON_SCOPE" ]; then
          continue
        fi
        ;;
    esac
    log "Running migration: $(basename "$script")"
    BACKONE_HOME="$HOME_DIR" bash "$script" || log "Migration warning: $(basename "$script")"
  done
}

migrate_zerotier() {
  if [ -d "$LEGACY_HOME" ] && [ ! -f "$HOME_DIR/identity.public" ]; then
    log "Migrating $LEGACY_HOME -> $HOME_DIR"
    mkdir -p "$HOME_DIR"
    cp -a "$LEGACY_HOME/." "$HOME_DIR/" 2>/dev/null || true
    ln -sfn "$HOME_DIR" "$LEGACY_HOME" 2>/dev/null || true
  fi
}

rebuild_manifest() {
  local registry="${HOME_DIR}/addons.d/enabled.json"
  mkdir -p "${HOME_DIR}/addons.d"
  if [ ! -f "$registry" ]; then
    echo '[]' > "$registry"
  fi
  local script_dir manifest_script
  script_dir="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
  manifest_script="${script_dir}/rebuild-addon-manifest.sh"
  if [ ! -x "$manifest_script" ]; then
    echo "backone-updater: ${manifest_script} not found" >&2
    exit 1
  fi
  local count
  count="$(BACKONE_HOME="$HOME_DIR" BACKONE_ADDONS_DIR="${BACKONE_ADDONS_DIR}" bash "$manifest_script")"
  log "Wrote ${HOME_DIR}/app/addons/manifest.json (${count} UI addons)"
}

cmd_migrate() {
  local scope="all"
  ADDON_SCOPE=""
  while [ $# -gt 0 ]; do
    case "$1" in
      --core) scope="core"; shift ;;
      --addon) ADDON_SCOPE="$2"; scope="addon"; shift 2 ;;
      --dry-run)
        log "Dry run: would migrate scope=$scope addon=$ADDON_SCOPE"
        ls -1 "$MIGRATIONS" 2>/dev/null || true
        exit 0
        ;;
      *) shift ;;
    esac
  done
  migrate_zerotier
  run_migrations "$scope"
  write_version
  rebuild_manifest
  log "Migration complete"
}

cmd_status() {
  echo "Installed: $(read_version)"
  echo "Package version: $(cat "${BACKONE_ADDONS_DIR}/comms-core/addon.json" 2>/dev/null | grep '"version"' | head -1 || cat debian/version 2>/dev/null || echo unknown)"
  echo "Addons registry: ${HOME_DIR}/addons.d/enabled.json"
}

case "${1:-}" in
  migrate) shift; cmd_migrate "$@" ;;
  status) cmd_status ;;
  rebuild-manifest) rebuild_manifest ;;
  *) echo "Usage: backone-updater migrate [--core|--addon ID] [--dry-run] | status | rebuild-manifest" >&2; exit 1 ;;
esac
