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

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TMP_DIR="$ROOT/.tmp/operator-handoff"
FINANCE_REPO="${FINANCE_REPO:-$HOME/.hermes/repos/FinanceManager}"
AUTOSHORTS_REPO="${AUTOSHORTS_REPO:-$HOME/projects/AutoShorts_Dashboard}"
HEALTH_DASHBOARD_FILE="${HEALTH_HANDOFF_DASHBOARD_FILE:-$HOME/.hermes/assets/Gesundheit/reports/health_dashboard.html}"
mkdir -p "$TMP_DIR"

TAILNET_IP="${JARVIS_HANDOFF_HOST:-}"
if [[ -z "$TAILNET_IP" ]] && command -v tailscale >/dev/null 2>&1; then
  TAILNET_IP="$(tailscale ip -4 2>/dev/null | head -n1 || true)"
fi
HOST="${TAILNET_IP:-127.0.0.1}"
if [[ -z "$HOST" ]]; then HOST="127.0.0.1"; fi

is_port_free() {
  python3 - "$1" "$2" <<'PY'
import socket, sys
host=sys.argv[1]
port=int(sys.argv[2])
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
    s.bind((host, port))
except OSError:
    raise SystemExit(1)
finally:
    s.close()
PY
}
free_port() {
  python3 - "$1" <<'PY'
import socket, sys
host=sys.argv[1]
s=socket.socket()
s.bind((host, 0))
print(s.getsockname()[1])
s.close()
PY
}
choose_port() {
  local label="$1" requested="$2"
  if is_port_free "$HOST" "$requested"; then echo "$requested"; else
    local alt; alt="$(free_port "$HOST")"
    echo "WARN: $label port $requested is already in use on $HOST; using free port $alt. No foreign process was killed." >&2
    echo "$alt"
  fi
}
wait_url() {
  local url="$1" label="$2"
  for _ in $(seq 1 120); do
    if curl -fsS --max-time 2 "$url" >/dev/null 2>&1; then echo "OK: $label reachable: $url"; return 0; fi
    sleep 0.25
  done
  echo "ERROR: $label did not become reachable: $url" >&2
  return 1
}
start_bg() {
  local name="$1" workdir="$2"; shift 2
  (
    cd "$workdir"
    exec "$@"
  ) >"$TMP_DIR/$name.log" 2>&1 &
  echo "$!" >"$TMP_DIR/$name.pid"
}

if [[ -f "$TMP_DIR/jarvis-dashboard.pid" || -f "$TMP_DIR/jarvis-api.pid" ]]; then
  echo "ERROR: operator handoff PID files already exist. Run: make handoff-stop" >&2
  exit 1
fi

JARVIS_API_PORT="$(choose_port jarvis-api "${JARVIS_HANDOFF_API_PORT:-8011}")"
JARVIS_FRONTEND_PORT="$(choose_port jarvis-dashboard "${JARVIS_HANDOFF_DASHBOARD_PORT:-5175}")"
FINANCE_API_PORT="$(choose_port finance-api "${FINANCE_HANDOFF_API_PORT:-8012}")"
# FamilyDashboard owns 5173 by convention; keep Finance away from that fixed port.
FINANCE_FRONTEND_PORT="$(choose_port finance-dashboard "${FINANCE_HANDOFF_DASHBOARD_PORT:-5176}")"
FAMILY_DASHBOARD_PORT="${FAMILY_DASHBOARD_PORT:-5173}"
AUTOSHORTS_API_PORT="$(choose_port autoshorts-api "${AUTOSHORTS_HANDOFF_API_PORT:-8013}")"
AUTOSHORTS_FRONTEND_PORT="$(choose_port autoshorts-dashboard "${AUTOSHORTS_HANDOFF_DASHBOARD_PORT:-5177}")"
HEALTH_DASHBOARD_PORT="$(choose_port health-dashboard "${HEALTH_HANDOFF_DASHBOARD_PORT:-8014}")"

JARVIS_API_URL="http://$HOST:$JARVIS_API_PORT"
JARVIS_FRONTEND_URL="http://$HOST:$JARVIS_FRONTEND_PORT"
FINANCE_API_URL="http://$HOST:$FINANCE_API_PORT"
FINANCE_FRONTEND_URL="http://$HOST:$FINANCE_FRONTEND_PORT"
AUTOSHORTS_API_URL="http://$HOST:$AUTOSHORTS_API_PORT"
AUTOSHORTS_FRONTEND_URL="http://$HOST:$AUTOSHORTS_FRONTEND_PORT"
FAMILY_DASHBOARD_URL="${FAMILY_DASHBOARD_URL:-http://$HOST:$FAMILY_DASHBOARD_PORT}"
HEALTH_DASHBOARD_URL=""
if [[ -f "$HEALTH_DASHBOARD_FILE" ]]; then
  HEALTH_DASHBOARD_URL="http://$HOST:$HEALTH_DASHBOARD_PORT/health-dashboard"
fi

if [[ ! -d "$FINANCE_REPO/frontend" ]]; then echo "ERROR: Finance frontend repo not found: $FINANCE_REPO" >&2; exit 1; fi
if [[ ! -d "$AUTOSHORTS_REPO/frontend" || ! -d "$AUTOSHORTS_REPO/backend" ]]; then echo "ERROR: AutoShorts Dashboard repo not found: $AUTOSHORTS_REPO" >&2; exit 1; fi

FINANCE_PYTHON="${FINANCE_PYTHON:-$FINANCE_REPO/.venv/bin/python}"
if [[ ! -x "$FINANCE_PYTHON" ]]; then FINANCE_PYTHON="python3"; fi
start_bg finance-api "$FINANCE_REPO" env \
  JARVIS_FINANCE_CORS_ORIGINS="$FINANCE_FRONTEND_URL,$JARVIS_FRONTEND_URL,http://localhost:$FINANCE_FRONTEND_PORT,http://127.0.0.1:$FINANCE_FRONTEND_PORT" \
  PYTHONPATH=src "$FINANCE_PYTHON" -m uvicorn jarvis_finance.api.main:app --host "$HOST" --port "$FINANCE_API_PORT"
wait_url "$FINANCE_API_URL/api/health" "Finance API"
start_bg finance-dashboard "$FINANCE_REPO/frontend" env VITE_API_BASE_URL="$FINANCE_API_URL" ./node_modules/.bin/vite --host "$HOST" --port "$FINANCE_FRONTEND_PORT"
wait_url "$FINANCE_FRONTEND_URL/" "Finance Dashboard"

AUTOSHORTS_TMP="$TMP_DIR/autoshorts-runtime"
mkdir -p "$AUTOSHORTS_TMP/storage"
start_bg autoshorts-api "$AUTOSHORTS_REPO/backend" env \
  AUTOSHORTS_DATABASE_URL="sqlite:///$AUTOSHORTS_TMP/autoshorts_dashboard.db" \
  AUTOSHORTS_STORAGE_ROOT="$AUTOSHORTS_TMP/storage" \
  AUTOSHORTS_SECRET_KEY="operator-handoff-dev-only" \
  AUTOSHORTS_REDIS_URL="redis://127.0.0.1:0/0" \
  AUTOSHORTS_CORS_ORIGINS="[\"$AUTOSHORTS_FRONTEND_URL\",\"http://localhost:$AUTOSHORTS_FRONTEND_PORT\",\"http://127.0.0.1:$AUTOSHORTS_FRONTEND_PORT\"]" \
  uv run uvicorn app.main:app --host "$HOST" --port "$AUTOSHORTS_API_PORT"
wait_url "$AUTOSHORTS_API_URL/api/health" "AutoShorts API"
start_bg autoshorts-dashboard "$AUTOSHORTS_REPO/frontend" env VITE_API_BASE_URL="$AUTOSHORTS_API_URL" ./node_modules/.bin/vite --host "$HOST" --port "$AUTOSHORTS_FRONTEND_PORT"
wait_url "$AUTOSHORTS_FRONTEND_URL/" "AutoShorts Dashboard"

if [[ -n "$HEALTH_DASHBOARD_URL" ]]; then
  start_bg health-dashboard "$ROOT" env HEALTH_DASHBOARD_FILE="$HEALTH_DASHBOARD_FILE" HEALTH_DASHBOARD_HOST="$HOST" HEALTH_DASHBOARD_PORT="$HEALTH_DASHBOARD_PORT" python3 scripts/health-dashboard-static-server.py
  wait_url "$HEALTH_DASHBOARD_URL" "Health Dashboard"
else
  echo "INFO: Health Dashboard not reachable; safe cockpit will remain internal only."
fi

start_bg jarvis-api "$ROOT/apps/api-gateway" env \
  JARVIS_ENV=development JARVIS_DEMO_MODE=0 JARVIS_OPERATOR_DEMO_PROFILE=mixed_readonly_handoff JARVIS_ACTIONS_ENABLED=0 \
  JARVIS_PUBLIC_BASE_URL="$JARVIS_FRONTEND_URL" JARVIS_OPERATOR_PUBLIC_ORIGIN="$JARVIS_FRONTEND_URL" JARVIS_ALLOW_TAILNET_LINKS=1 \
  JARVIS_GATEWAY_HOST="$HOST" JARVIS_GATEWAY_PORT="$JARVIS_API_PORT" \
  JARVIS_DEV_CORS_ORIGINS="$JARVIS_FRONTEND_URL,http://localhost:$JARVIS_FRONTEND_PORT,http://127.0.0.1:$JARVIS_FRONTEND_PORT" \
  FINANCE_ADAPTER_MODE=mock HEALTH_ADAPTER_MODE=mock AUTOSHORTS_ADAPTER_MODE=mock \
  FINANCE_LEGACY_DASHBOARD_URL="$FINANCE_FRONTEND_URL" HEALTH_LEGACY_DASHBOARD_URL="$HEALTH_DASHBOARD_URL" AUTOSHORTS_LEGACY_DASHBOARD_URL="$AUTOSHORTS_FRONTEND_URL" FAMILY_LEGACY_DASHBOARD_URL="$FAMILY_DASHBOARD_URL" \
  ALLOW_EXACT_FINANCE_VALUES=0 ALLOW_HEALTH_DETAIL_LINKS=0 PYTHONPATH=. python3 -m uvicorn jarvis_gateway.main:app --host "$HOST" --port "$JARVIS_API_PORT"
wait_url "$JARVIS_API_URL/api/healthz" "JARVIS API"
start_bg jarvis-dashboard "$ROOT/apps/dashboard" env VITE_API_BASE_URL="$JARVIS_API_URL" VITE_JARVIS_DEMO_MODE=0 VITE_FAMILY_DASHBOARD_URL="$FAMILY_DASHBOARD_URL" ./node_modules/.bin/vite --host "$HOST" --port "$JARVIS_FRONTEND_PORT"
wait_url "$JARVIS_FRONTEND_URL/" "JARVIS Dashboard"

cat >"$TMP_DIR/handoff.env" <<EOF
MODE=mixed_readonly_handoff
HOST=$HOST
JARVIS_API_URL=$JARVIS_API_URL
JARVIS_FRONTEND_URL=$JARVIS_FRONTEND_URL
FINANCE_API_URL=$FINANCE_API_URL
FINANCE_FRONTEND_URL=$FINANCE_FRONTEND_URL
AUTOSHORTS_API_URL=$AUTOSHORTS_API_URL
AUTOSHORTS_FRONTEND_URL=$AUTOSHORTS_FRONTEND_URL
FAMILY_DASHBOARD_URL=$FAMILY_DASHBOARD_URL
HEALTH_DASHBOARD_URL=$HEALTH_DASHBOARD_URL
EOF

echo ""
echo "JARVIS Operator Handoff ready:"
echo ""
echo "JARVIS Dashboard:"
echo "$JARVIS_FRONTEND_URL"
echo ""
echo "JARVIS API:"
echo "$JARVIS_API_URL"
echo ""
echo "Finance Dashboard:"
echo "$FINANCE_FRONTEND_URL"
echo ""
echo "AutoShorts Dashboard:"
echo "$AUTOSHORTS_FRONTEND_URL"
echo ""
echo "Family Dashboard:"
echo "$FAMILY_DASHBOARD_URL"
echo ""
echo "Health Dashboard:"
if [[ -n "$HEALTH_DASHBOARD_URL" ]]; then echo "$HEALTH_DASHBOARD_URL"; else echo "not reachable - JARVIS cockpit only"; fi
echo ""
echo "Mode:"
echo "mixed_readonly_handoff"
echo ""
echo "Actions:"
echo "disabled"
echo ""
echo "Stop: make handoff-stop"
