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

ROOT="/Users/hu/aisupport"
BE_DIR="$ROOT/services/oncall-v2"
FE_DIR="$ROOT/apps/oncall-v2-web"
LOG_DIR="$ROOT/.runlogs"
BACKEND_PORT="${BACKEND_PORT:-8080}"
FRONTEND_PORT="${FRONTEND_PORT:-3000}"
DEV_BYPASS_USER_EMAIL="${DEV_BYPASS_USER_EMAIL:-}"
API_BASE_URL="${API_BASE_URL:-http://localhost:${BACKEND_PORT}}"
mkdir -p "$LOG_DIR"

kill_port() {
  local port="$1"
  local pids
  pids=$(lsof -tiTCP:"$port" -sTCP:LISTEN 2>/dev/null || true)
  if [[ -n "${pids}" ]]; then
    echo "[kill] port $port -> $pids"
    kill $pids || true
    sleep 1
    pids=$(lsof -tiTCP:"$port" -sTCP:LISTEN 2>/dev/null || true)
    if [[ -n "${pids}" ]]; then
      kill -9 $pids || true
    fi
  fi
}

echo "[1/4] stop old frontend/backend"
kill_port 3000
kill_port 8080
kill_port 18080
kill_port "$FRONTEND_PORT"
kill_port "$BACKEND_PORT"

if [[ -z "$DEV_BYPASS_USER_EMAIL" ]]; then
  echo "DEV_BYPASS_USER_EMAIL must be set explicitly" >&2
  exit 1
fi

echo "[2/4] build and start backend (latest source)"
cd "$BE_DIR"
GO_BIN="$(command -v go)"
if [[ -z "$GO_BIN" ]]; then
  echo "go not found" >&2
  exit 1
fi
"$GO_BIN" build -o oncall-v2 main.go

BE_LOG="$LOG_DIR/oncall-v2-backend.log"
AUTHING_ENABLED=false \
DEV_BYPASS_AUTH=true \
DEV_BYPASS_USER_EMAIL="$DEV_BYPASS_USER_EMAIL" \
ONCALL_LISTEN_ADDR=":${BACKEND_PORT}" \
nohup ./oncall-v2 >"$BE_LOG" 2>&1 &
BE_PID=$!

echo "[wait] backend health"
for _ in {1..30}; do
  code=$(curl -s -o /dev/null -w "%{http_code}" "${API_BASE_URL%/}/api1/schedule/overview" || true)
  if [[ "$code" == "200" || "$code" == "401" ]]; then
    break
  fi
  sleep 1
done

echo "[3/4] refresh frontend api client and start frontend"
cd "$FE_DIR"
npm run generate-api >/dev/null
FE_LOG="$LOG_DIR/oncall-v2-frontend.log"
PORT="$FRONTEND_PORT" REACT_APP_ONCALL_API_BASE="$API_BASE_URL" \
nohup npm start >"$FE_LOG" 2>&1 &
FE_PID=$!

echo "[wait] frontend dev server"
for _ in {1..60}; do
  code=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:${FRONTEND_PORT}" || true)
  if [[ "$code" == "200" || "$code" == "304" ]]; then
    break
  fi
  sleep 1
done

echo "[4/4] done"
echo "backend pid: $BE_PID"
echo "frontend pid: $FE_PID"
echo "logs:"
echo "  $BE_LOG"
echo "  $FE_LOG"
echo "ports:"
lsof -nP -iTCP:"$BACKEND_PORT" -sTCP:LISTEN || true
lsof -nP -iTCP:"$FRONTEND_PORT" -sTCP:LISTEN || true
