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

BASE_URL="${1:-${GBASE_WATCH_BASE_URL:-http://127.0.0.1:8080}}"
TIMEOUT="${GBASE_WATCH_TIMEOUT:-12}"
COOKIE_HEADER="${GBASE_WATCH_COOKIE:-}"

endpoints=(
  "/p/menu/treeMenu"
  "/p/staff/tree"
  "/p/staff/sport"
  "/p/station/show"
  "/p/equipment/consumeList"
  "/p/mealOrder/list"
  "/p/Restaurant/index"
)

curl_args=(-sS -m "$TIMEOUT" -X POST)
if [[ -n "$COOKIE_HEADER" ]]; then
  curl_args+=(-H "Cookie: $COOKIE_HEADER")
fi

failures=0

classify_response() {
  local body="$1"
  if grep -q "您尚未登录" <<<"$body"; then
    echo "未登录：当前浏览器/脚本没有有效后端会话，需先重新登录 GBase 后端或传入 GBASE_WATCH_COOKIE。"
  elif grep -q "控制器不存在" <<<"$body"; then
    echo "后端部署版本缺控制器：前端已请求该接口，但远端 application/*/controller 缺对应文件。需同步后端代码基线。"
  elif grep -q "方法不存在" <<<"$body"; then
    echo "后端部署版本缺方法：控制器存在但缺目标 action。通常是远端代码版本落后或默认路由打到旧控制器。需同步方法并补显式路由。"
  elif grep -q "Call to undefined method" <<<"$body"; then
    echo "后端公共基类/依赖版本不一致：控制器调用了当前代码依赖的方法，但远端基类或 trait 未同步。需整体同步同一代码版本。"
  elif grep -qi "Too few arguments to function" <<<"$body"; then
    echo "后端方法签名版本不一致：调用方传参数量与被调用 logic/service 方法签名不匹配。通常是远端控制器和逻辑层没有同步到同一代码基线。"
  elif grep -qi "GROUP BY\\|必须包含在 GROUP BY" <<<"$body"; then
    echo "GBase SQL 兼容问题：MySQL 宽松 GROUP BY 在 GBase 8s 下不兼容，需把非分组字段改为聚合字段或加入 GROUP BY。"
  elif grep -qi "CONVERT(.*USING gbk\\|USING gbk" <<<"$body"; then
    echo "GBase SQL 兼容问题：GBase 不支持 MySQL CONVERT(name USING gbk) 排序写法，需改为兼容排序或应用层排序。"
  elif grep -qi "PDOException\\|System Error\\|ThinkException" <<<"$body"; then
    echo "后端运行异常：需结合响应体中的 error_sql、控制器、行号继续定位。"
  else
    echo ""
  fi
}

for endpoint in "${endpoints[@]}"; do
  url="${BASE_URL%/}${endpoint}"
  body="$(curl "${curl_args[@]}" "$url" || true)"
  reason="$(classify_response "$body")"
  code="$(printf '%s' "$body" | sed -n 's/.*"code"[[:space:]]*:[[:space:]]*\([^,}]*\).*/\1/p' | head -1)"
  if [[ -n "$reason" ]]; then
    failures=$((failures + 1))
    printf '[FAIL] %s\n  code: %s\n  reason: %s\n' "$endpoint" "${code:-unknown}" "$reason"
    printf '  sample: %s\n' "$(printf '%s' "$body" | tr '\n' ' ' | cut -c 1-240)"
  else
    printf '[OK] %s code=%s\n' "$endpoint" "${code:-unknown}"
  fi
done

if [[ "$failures" -gt 0 ]]; then
  printf '\nDetected %s GBase adaptation/API compatibility issue(s).\n' "$failures"
  exit 1
fi

printf '\nNo known GBase adaptation/API compatibility errors detected.\n'
