#!/usr/bin/env bash
# Smoke test for L4 production / L3 UAT / L2 test
# 部署后跑：健康检查 + 关键路径 200 + 前端构建期 env 校验
#
# Usage: bash scripts/ops/smoke-test.sh <env>
#   env: test | uat | production
#
# 端口映射与 scripts/deploy/deploy.sh 的 ENV_CONFIG 保持一致；任一处变更必须同步更新。
# NEXT_PUBLIC_API_URL 从 .env.{test,uat,pro} 读取（frontend/.env 是软链）。

set -euo pipefail

ENV="${1:-}"
if [[ -z "$ENV" ]]; then
  echo "Usage: $0 <test|uat|production>" >&2
  exit 2
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"

case "$ENV" in
  test)
    DEFAULT_BACKEND_PORT=5001
    DEFAULT_FRONTEND_PORT=5000
    ENV_FILE="$PROJECT_ROOT/.env.test"
    ;;
  uat)
    DEFAULT_BACKEND_PORT=7001
    DEFAULT_FRONTEND_PORT=7000
    ENV_FILE="$PROJECT_ROOT/.env.uat"
    ;;
  production)
    DEFAULT_BACKEND_PORT=6001
    DEFAULT_FRONTEND_PORT=6064
    ENV_FILE="$PROJECT_ROOT/.env.pro"
    ;;
  *) echo "Unknown env: $ENV (支持: test, uat, production)" >&2; exit 2 ;;
esac

BACKEND_URL="${SMOKE_BACKEND_URL:-http://localhost:$DEFAULT_BACKEND_PORT}"
FRONTEND_URL="${SMOKE_FRONTEND_URL:-http://localhost:$DEFAULT_FRONTEND_PORT}"

PASS=0
FAIL=0

check() {
  local name="$1"
  local cmd="$2"
  echo -n "  [$name] ... "
  if eval "$cmd" >/dev/null 2>&1; then
    echo "✅ PASS"
    PASS=$((PASS+1))
  else
    echo "❌ FAIL"
    FAIL=$((FAIL+1))
  fi
}

echo "=== Smoke test: $ENV (backend=$BACKEND_URL frontend=$FRONTEND_URL) ==="
check "Backend /health 200"     "curl -fsS '$BACKEND_URL/api/v1/health'"
check "Frontend root 200"        "curl -fsSI '$FRONTEND_URL' | head -1 | grep -q '200'"
check "Backend /api/v1/auth/login 4xx (no creds)"  "test \$(curl -s -o /dev/null -w '%{http_code}' '$BACKEND_URL/api/v1/auth/login') -ge 400"

# NEXT_PUBLIC_API_URL 校验：必须以 /api/v1 结尾
# 防止类似 dev 上把 .env.dev 配成 ".../api"（缺 /v1）→ 前端 build 进 bundle，登录 404。
# 见 issue #185
echo -n "  [frontend NEXT_PUBLIC_API_URL ends with /api/v1] ... "
if [[ ! -f "$ENV_FILE" ]]; then
  echo "❌ FAIL ($ENV_FILE not found)"
  FAIL=$((FAIL+1))
else
  API_URL=$(grep -E '^NEXT_PUBLIC_API_URL=' "$ENV_FILE" | tail -1 | cut -d= -f2- | tr -d '"' | tr -d "'")
  if [[ -z "$API_URL" ]]; then
    echo "❌ FAIL (NEXT_PUBLIC_API_URL not set in $ENV_FILE)"
    FAIL=$((FAIL+1))
  elif [[ "$API_URL" != */api/v1 && "$API_URL" != */api/v1/ ]]; then
    echo "❌ FAIL (got '$API_URL', expected ends with /api/v1)"
    FAIL=$((FAIL+1))
  else
    echo "✅ PASS ($API_URL)"
    PASS=$((PASS+1))
  fi
fi

echo ""
echo "Result: $PASS passed, $FAIL failed"
[[ $FAIL -eq 0 ]] || exit 1
