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

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TMP_DIR="$ROOT/.tmp/operator-demo"
PROFILE="${JARVIS_OPERATOR_DEMO_PROFILE:-${1:-demo_mock}}"
API_PORT="${JARVIS_DEMO_API_PORT:-8010}"
DASHBOARD_PORT="${JARVIS_DEMO_DASHBOARD_PORT:-5173}"
OPEN_BROWSER=0

if [[ "${1:-}" == "--open" || "${2:-}" == "--open" ]]; then
  OPEN_BROWSER=1
  if [[ "${1:-}" == "--open" ]]; then PROFILE="${JARVIS_OPERATOR_DEMO_PROFILE:-demo_mock}"; fi
fi

mkdir -p "$TMP_DIR"

is_port_free() {
  python3 - "$1" <<'PY'
import socket, sys
port=int(sys.argv[1])
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
    s.bind(('127.0.0.1', port))
except OSError:
    raise SystemExit(1)
finally:
    s.close()
PY
}

free_port() {
  python3 - <<'PY'
import socket
s=socket.socket()
s.bind(('127.0.0.1', 0))
print(s.getsockname()[1])
s.close()
PY
}

choose_port() {
  local label="$1"
  local requested="$2"
  if is_port_free "$requested"; then
    echo "$requested"
  else
    local alt
    alt="$(free_port)"
    echo "WARN: $label port $requested is already in use; using free port $alt. No foreign process was killed." >&2
    echo "$alt"
  fi
}

wait_url() {
  local url="$1"
  local label="$2"
  for _ in $(seq 1 100); do
    if curl -fsS --max-time 1 "$url" >/dev/null 2>&1; then
      echo "OK: $label reachable: $url"
      return 0
    fi
    sleep 0.2
  done
  echo "ERROR: $label did not become reachable: $url" >&2
  return 1
}

assert_safe_local_url() {
  local name="$1"
  local value="${!name:-}"
  [[ -z "$value" ]] && return 0
  if [[ ! "$value" =~ ^http://(127\.0\.0\.1|localhost):[0-9]+/?$ ]]; then
    echo "ERROR: $name must be localhost/127.0.0.1 only for operator demo." >&2
    exit 1
  fi
}

if [[ "$PROFILE" != "demo_mock" && "$PROFILE" != "demo_mixed_readonly" ]]; then
  echo "ERROR: unsupported profile '$PROFILE'. Use demo_mock or demo_mixed_readonly." >&2
  exit 1
fi

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

API_PORT="$(choose_port api "$API_PORT")"
DASHBOARD_PORT="$(choose_port dashboard "$DASHBOARD_PORT")"
API_BASE="http://127.0.0.1:$API_PORT"
FRONTEND_BASE="http://127.0.0.1:$DASHBOARD_PORT"

FINANCE_MODE="mock"
HEALTH_MODE="mock"
AUTOSHORTS_MODE="mock"
RUNTIME_ACCESS="disabled"

if [[ "$PROFILE" == "demo_mixed_readonly" ]]; then
  FINANCE_MODE="${FINANCE_ADAPTER_MODE:-mock}"
  HEALTH_MODE="${HEALTH_ADAPTER_MODE:-mock}"
  AUTOSHORTS_MODE="${AUTOSHORTS_ADAPTER_MODE:-mock}"
  RUNTIME_ACCESS="optional_readonly"
  assert_safe_local_url FINANCE_API_BASE_URL
  assert_safe_local_url AUTOSHORTS_API_BASE_URL
fi

export JARVIS_ENV=development
export JARVIS_DEMO_MODE=1
export JARVIS_PUBLIC_BASE_URL=http://127.0.0.1:$DASHBOARD_PORT
export JARVIS_GATEWAY_HOST=127.0.0.1
export JARVIS_GATEWAY_PORT="$API_PORT"
export JARVIS_DEV_CORS_ORIGINS="http://127.0.0.1:$DASHBOARD_PORT,http://localhost:$DASHBOARD_PORT"
export FINANCE_ADAPTER_MODE="$FINANCE_MODE"
export HEALTH_ADAPTER_MODE="$HEALTH_MODE"
export AUTOSHORTS_ADAPTER_MODE="$AUTOSHORTS_MODE"
export ALLOW_EXACT_FINANCE_VALUES=0
export ALLOW_HEALTH_DETAIL_LINKS=0

(
  cd "$ROOT/apps/api-gateway"
  PYTHONPATH=. exec python3 -m uvicorn jarvis_gateway.main:app --host 127.0.0.1 --port "$API_PORT"
) >"$TMP_DIR/gateway.log" 2>&1 &
echo "$!" >"$TMP_DIR/gateway.pid"

wait_url "$API_BASE/api/healthz" "API healthz" || { "$ROOT/scripts/stop-operator-demo.sh" >/dev/null 2>&1 || true; exit 1; }

(
  cd "$ROOT/apps/dashboard"
  VITE_API_BASE_URL="$API_BASE" VITE_JARVIS_DEMO_MODE=1 exec ./node_modules/.bin/vite --host 127.0.0.1 --port "$DASHBOARD_PORT"
) >"$TMP_DIR/dashboard.log" 2>&1 &
echo "$!" >"$TMP_DIR/dashboard.pid"

wait_url "$FRONTEND_BASE/" "Dashboard" || { "$ROOT/scripts/stop-operator-demo.sh" >/dev/null 2>&1 || true; exit 1; }

cat >"$TMP_DIR/demo.env" <<EOF
PROFILE=$PROFILE
MODE=$PROFILE
RUNTIME_ACCESS=$RUNTIME_ACCESS
API_PORT=$API_PORT
DASHBOARD_PORT=$DASHBOARD_PORT
API_BASE=$API_BASE
FRONTEND_BASE=$FRONTEND_BASE
EOF

echo ""
echo "JARVIS Dashboard ready:"
echo "Frontend: $FRONTEND_BASE"
echo "API:      $API_BASE"
echo "Mode:     $PROFILE"
echo "Actions:  disabled"
echo "Stop:     make demo-stop"

if [[ "$OPEN_BROWSER" == "1" ]]; then
  if command -v xdg-open >/dev/null 2>&1; then
    xdg-open "$FRONTEND_BASE" >/dev/null 2>&1 || true
  else
    echo "INFO: xdg-open not available; open the Frontend URL manually."
  fi
fi
