#!/usr/bin/env zsh
# start-dev.sh — Interactive VSR local dev startup script
# Usage: ./start-dev.sh
# Runs from the workspace root.
set -euo pipefail

CYAN='\033[0;36m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'

ROOT="$(cd "$(dirname "$0")" && pwd)"
LOG_DIR="$ROOT/tmp/dev-logs"
mkdir -p "$LOG_DIR"

PIDS=()

cleanup() {
  echo ""
  echo "${YELLOW}==> Stopping all VSR dev processes...${NC}"
  for pid in "${PIDS[@]}"; do
    kill "$pid" 2>/dev/null && echo "  killed PID $pid" || true
  done
  echo "${GREEN}==> Done. Goodbye.${NC}"
  exit 0
}
trap cleanup INT TERM

echo ""
echo "${BOLD}${CYAN}╔══════════════════════════════════════════╗${NC}"
echo "${BOLD}${CYAN}║      VSR Local Dev Environment Setup     ║${NC}"
echo "${BOLD}${CYAN}╚══════════════════════════════════════════╝${NC}"
echo ""

# ── 1. Prerequisites ──────────────────────────────────────────────────────────

echo "${BOLD}==> Checking prerequisites...${NC}"

# Node
if ! command -v node >/dev/null 2>&1; then
  echo "${RED}✗ node not found. Install Node ≥ 24 via nvm.${NC}"
  exit 1
fi
NODE_VER=$(node --version)
echo "  ✓ node $NODE_VER"

# pnpm
if ! command -v pnpm >/dev/null 2>&1; then
  echo "${RED}✗ pnpm not found. Run: npm install -g pnpm@10${NC}"
  exit 1
fi
PNPM_VER=$(pnpm --version)
echo "  ✓ pnpm $PNPM_VER"

# Docker
if ! command -v docker >/dev/null 2>&1; then
  echo "${RED}✗ docker not found. Install Docker Desktop.${NC}"
  exit 1
fi
echo "  ✓ docker available"

# ── 2. Docker Postgres ────────────────────────────────────────────────────────

echo ""
echo "${BOLD}==> Checking PostgreSQL container (vsr-postgres)...${NC}"

POSTGRES_STATUS=$(docker inspect --format '{{.State.Status}}' vsr-postgres 2>/dev/null || echo "missing")

if [[ "$POSTGRES_STATUS" == "running" ]]; then
  HEALTH=$(docker inspect --format '{{.State.Health.Status}}' vsr-postgres 2>/dev/null || echo "unknown")
  echo "  ✓ vsr-postgres running (health: $HEALTH)"
elif [[ "$POSTGRES_STATUS" == "missing" ]]; then
  echo "  ✗ vsr-postgres not found — starting with docker compose..."
  (cd "$ROOT/docker" && docker compose up -d)
  echo "  ✓ vsr-postgres started"
else
  echo "  ↺ vsr-postgres is $POSTGRES_STATUS — restarting..."
  (cd "$ROOT/docker" && docker compose up -d)
  echo "  ✓ vsr-postgres restarted"
fi

# ── 3. pnpm install ───────────────────────────────────────────────────────────

echo ""
echo "${BOLD}==> Checking dependencies...${NC}"
if [[ ! -f "$ROOT/node_modules/.modules.yaml" ]]; then
  echo "  ↺ node_modules missing — running pnpm install..."
  (cd "$ROOT" && pnpm install)
  echo "  ✓ dependencies installed"
else
  echo "  ✓ node_modules present (run 'pnpm install' manually if stale)"
fi

# ── 4. Mode selection ─────────────────────────────────────────────────────────

echo ""
echo "${BOLD}==> Select startup mode:${NC}"
echo "  1) Stub mode      — frontend (:3000) + mock GraphQL server (:4000)"
echo "                      No database needed. Fast. Recommended for UI work."
echo "  2) Full stack     — frontend (:3000) + real GraphQL server (:4001) + Postgres"
echo "                      Uses local Docker DB + live Snowflake reads. Recommended default."
echo "  3) All services   — all three (stub :4000, real :4001, frontend :3000)"
echo "  q) Quit"
echo ""
printf "${CYAN}Enter choice [2]: ${NC}"
read -r MODE_CHOICE
MODE_CHOICE="${MODE_CHOICE:-2}"

case "$MODE_CHOICE" in
  1|stub)
    START_STUB=true
    START_REAL=false
    echo "${GREEN}  → Stub mode selected${NC}"
    ;;
  2|full)
    START_STUB=false
    START_REAL=true
    echo "${GREEN}  → Full stack mode selected${NC}"
    ;;
  3|all)
    START_STUB=true
    START_REAL=true
    echo "${GREEN}  → All services selected${NC}"
    ;;
  q|Q)
    echo "Bye."
    exit 0
    ;;
  *)
    echo "${YELLOW}  Unknown choice — defaulting to stub mode${NC}"
    START_STUB=true
    START_REAL=false
    ;;
esac

# ── 5. Warn if full stack mode needs .env.local ───────────────────────────────

if [[ "$START_REAL" == "true" ]]; then
  SERVER_ENV="$ROOT/packages/vsr-graphql-server/.env.local"
  if [[ ! -f "$SERVER_ENV" ]]; then
    echo "${RED}  ✗ Missing: packages/vsr-graphql-server/.env.local${NC}"
    echo "  Create it with DATABASE_URL, DEV_MODE=true, and SNOWFLAKE_* connection vars"
    exit 1
  fi
  echo "  ✓ packages/vsr-graphql-server/.env.local found"

  # Validate required Snowflake vars for live catalog reads
  MISSING_SF=()
  for key in SNOWFLAKE_ACCOUNT SNOWFLAKE_USER SNOWFLAKE_WAREHOUSE SNOWFLAKE_DATABASE SNOWFLAKE_SCHEMA; do
    if ! grep -q "^${key}=" "$SERVER_ENV"; then
      MISSING_SF+=("$key")
    fi
  done

  if ! grep -q '^SNOWFLAKE_KEY_PASSPHRASE=' "$SERVER_ENV" && \
     ! grep -q '^SNOWFLAKE_PRIVATE_KEY_PATH=' "$SERVER_ENV" && \
     ! grep -q '^SNOWFLAKE_PRIVATE_KEY=' "$SERVER_ENV" && \
     ! grep -q '^SNOWFLAKE_PASSWORD=' "$SERVER_ENV"; then
    MISSING_SF+=("SNOWFLAKE_KEY_PASSPHRASE (and optionally SNOWFLAKE_PRIVATE_KEY_PATH; defaults to ~/.ssh/snowflake/rsa_key.p8)")
  fi

  if [[ ${#MISSING_SF[@]} -gt 0 ]]; then
    echo "${RED}  ✗ Real server requires live Snowflake config for VIRTUALSALESREP reads.${NC}"
    echo "  Add these keys to packages/vsr-graphql-server/.env.local:"
    for key in "${MISSING_SF[@]}"; do
      echo "    - $key"
    done
    exit 1
  fi

  echo "  ✓ Snowflake env keys present for live catalog reads"
fi

# ── 6. Frontend .env.local check ──────────────────────────────────────────────

FRONTEND_ENV="$ROOT/apps/vsr/.env.local"
if [[ ! -f "$FRONTEND_ENV" ]]; then
  if [[ -f "$ROOT/apps/vsr/.env.shadow" ]]; then
    echo "${YELLOW}  ⚠ Missing apps/vsr/.env.local — creating from .env.shadow...${NC}"
    cp "$ROOT/apps/vsr/.env.shadow" "$FRONTEND_ENV"
    echo "  ✓ apps/vsr/.env.local created (review and adjust as needed)"
  else
    echo "${RED}  ✗ Missing apps/vsr/.env.local — run: cp apps/vsr/.env.shadow apps/vsr/.env.local${NC}"
    exit 1
  fi
fi

# Set VITE_GRAPHQL_URL based on mode
if [[ "$START_REAL" == "true" ]]; then
  echo ""
  echo "${YELLOW}  ↺ Real GraphQL enabled: pointing frontend at :4001${NC}"
  sed -i '' 's|VITE_GRAPHQL_URL=.*|VITE_GRAPHQL_URL=http://localhost:4001/graphql|' "$FRONTEND_ENV"
else
  echo ""
  echo "  ✓ Frontend GraphQL URL: http://localhost:4000/graphql (stub)"
  sed -i '' 's|VITE_GRAPHQL_URL=.*|VITE_GRAPHQL_URL=http://localhost:4000/graphql|' "$FRONTEND_ENV" 2>/dev/null || true
fi

# ── 7. Start services ─────────────────────────────────────────────────────────

echo ""
echo "${BOLD}==> Starting services...${NC}"

if [[ "$START_STUB" == "true" ]]; then
  STUB_LOG="$LOG_DIR/stub-server.log"
  echo "  ↺ Starting stub server on :4000 (log: tmp/dev-logs/stub-server.log)"
  (cd "$ROOT" && pnpm --filter vsr-graphql-stub dev > "$STUB_LOG" 2>&1) &
  PIDS+=($!)
  sleep 2
  # Quick liveness check
  if curl -sf http://localhost:4000/ >/dev/null 2>&1 || \
     curl -sf -X POST http://localhost:4000/graphql -H 'Content-Type: application/json' \
       -d '{"query":"{__typename}"}' >/dev/null 2>&1; then
    echo "  ${GREEN}✓ Stub server ready at http://localhost:4000/graphql${NC}"
  else
    echo "  ${YELLOW}⏳ Stub server starting (may take a moment — check tmp/dev-logs/stub-server.log)${NC}"
  fi
fi

if [[ "$START_REAL" == "true" ]]; then
  REAL_LOG="$LOG_DIR/graphql-server.log"
  echo "  ↺ Starting real GraphQL server on :4001 (log: tmp/dev-logs/graphql-server.log)"
  (cd "$ROOT" && pnpm --filter @theorchard/vsr-graphql-server dev > "$REAL_LOG" 2>&1) &
  PIDS+=($!)
  sleep 3
  if curl -sf -X POST http://localhost:4001/graphql -H 'Content-Type: application/json' \
       -d '{"query":"{__typename}"}' >/dev/null 2>&1; then
    echo "  ${GREEN}✓ GraphQL server ready at http://localhost:4001/graphql${NC}"
  else
    echo "  ${YELLOW}⏳ GraphQL server starting (check tmp/dev-logs/graphql-server.log)${NC}"
  fi
fi

FRONTEND_LOG="$LOG_DIR/frontend.log"
echo "  ↺ Starting frontend on :3000 (log: tmp/dev-logs/frontend.log)"
(cd "$ROOT/apps/vsr" && pnpm dev > "$FRONTEND_LOG" 2>&1) &
PIDS+=($!)
sleep 3

# ── 8. Summary ────────────────────────────────────────────────────────────────

echo ""
echo "${BOLD}${GREEN}╔══════════════════════════════════════════════════════╗${NC}"
echo "${BOLD}${GREEN}║  VSR Dev Environment Running                         ║${NC}"
echo "${BOLD}${GREEN}╠══════════════════════════════════════════════════════╣${NC}"
if [[ "$START_STUB" == "true" ]]; then
echo "${BOLD}${GREEN}║  Stub GraphQL: http://localhost:4000/graphql          ║${NC}"
fi
if [[ "$START_REAL" == "true" ]]; then
echo "${BOLD}${GREEN}║  Real GraphQL: http://localhost:4001/graphql          ║${NC}"
fi
echo "${BOLD}${GREEN}║  Frontend:     http://localhost:3000                  ║${NC}"
echo "${BOLD}${GREEN}║  Postgres:     localhost:5432 (vsr_dev)               ║${NC}"
echo "${BOLD}${GREEN}╠══════════════════════════════════════════════════════╣${NC}"
echo "${BOLD}${GREEN}║  Logs: ./tmp/dev-logs/                                ║${NC}"
echo "${BOLD}${GREEN}║  Press Ctrl+C to stop all services                    ║${NC}"
echo "${BOLD}${GREEN}╚══════════════════════════════════════════════════════╝${NC}"
echo ""

# ── 9. Tail logs ──────────────────────────────────────────────────────────────

echo "${CYAN}==> Tailing all logs (Ctrl+C to stop all services):${NC}"
tail -f "$LOG_DIR"/*.log 2>/dev/null &
PIDS+=($!)

# Wait for interrupt
wait
