#!/usr/bin/env bash
# Smoke test after deployment. Run from the project root with the venv active.
#
#   BASE_URL=http://127.0.0.1:8000 ./scripts/verify.sh
set -uo pipefail

BASE_URL="${BASE_URL:-http://127.0.0.1:8000}"
API="$BASE_URL/api/v1"
ROOT="$(cd "$(dirname "$0")/.." && pwd)"

pass=0
fail=0

check() {
  local name="$1" expected="$2" actual="$3"
  if [ "$actual" = "$expected" ]; then
    echo "  ok    $name"
    pass=$((pass + 1))
  else
    echo "  FAIL  $name (expected $expected, got $actual)"
    fail=$((fail + 1))
  fi
}

code() { curl -s -o /dev/null -w '%{http_code}' "$@"; }

echo "== imports =="
(cd "$ROOT/backend" && python -c "import app.main" >/dev/null 2>&1) \
  && { echo "  ok    backend imports"; pass=$((pass + 1)); } \
  || { echo "  FAIL  backend imports"; fail=$((fail + 1)); }
(cd "$ROOT" && python -c "import bot.main" >/dev/null 2>&1) \
  && { echo "  ok    bot imports"; pass=$((pass + 1)); } \
  || { echo "  FAIL  bot imports"; fail=$((fail + 1)); }

echo "== migrations =="
(cd "$ROOT/backend" && alembic current >/dev/null 2>&1) \
  && { echo "  ok    alembic reachable"; pass=$((pass + 1)); } \
  || { echo "  FAIL  alembic reachable"; fail=$((fail + 1)); }

echo "== api =="
check "health" 200 "$(code "$BASE_URL/api/health")"
check "openapi" 200 "$(code "$BASE_URL/openapi.json")"
check "settings without token" 401 "$(code "$API/settings")"
check "admin dashboard without token" 401 "$(code "$API/admin/dashboard")"

BOT_TOKEN_VALUE="$(grep -E '^BOT_API_TOKEN=' "$ROOT/.env" 2>/dev/null | cut -d= -f2-)"
if [ -n "$BOT_TOKEN_VALUE" ]; then
  check "products with bot token" 200 \
    "$(code -H "X-Bot-Token: $BOT_TOKEN_VALUE" "$API/products")"
  check "categories with bot token" 200 \
    "$(code -H "X-Bot-Token: $BOT_TOKEN_VALUE" "$API/categories")"
  check "flows with bot token" 200 \
    "$(code -H "X-Bot-Token: $BOT_TOKEN_VALUE" "$API/flows")"
  check "bot config with bot token" 200 \
    "$(code -H "X-Bot-Token: $BOT_TOKEN_VALUE" "$API/bot/config")"
else
  echo "  skip  bot endpoints (BOT_API_TOKEN not found in .env)"
fi

ADMIN_USER="$(grep -E '^ADMIN_USERNAME=' "$ROOT/.env" 2>/dev/null | cut -d= -f2-)"
ADMIN_PASS="$(grep -E '^ADMIN_PASSWORD=' "$ROOT/.env" 2>/dev/null | cut -d= -f2-)"
if [ -n "$ADMIN_USER" ] && [ -n "$ADMIN_PASS" ]; then
  # Keep the payload in a variable: inline braces get brace-expanded inside $( ).
  LOGIN_PAYLOAD="{\"username\":\"$ADMIN_USER\",\"password\":\"$ADMIN_PASS\"}"
  check "admin login" 200 "$(code -X POST -H 'Content-Type: application/json' \
    -d "$LOGIN_PAYLOAD" "$API/auth/login")"
else
  echo "  skip  admin login (credentials not found in .env)"
fi

echo "== admin build =="
[ -f "$ROOT/admin/dist/index.html" ] \
  && { echo "  ok    admin/dist built"; pass=$((pass + 1)); } \
  || { echo "  FAIL  admin/dist built (run: cd admin && npm run build)"; fail=$((fail + 1)); }

echo
echo "passed: $pass   failed: $fail"
[ "$fail" -eq 0 ]
