#!/usr/bin/env bash
# Enum / union literal 扩展检查 (#259 B2)：staged TS 文件里新增了 enum 成员
# 或 union literal 时提示作者 grep 同模块 consumer 是否同步处理。
#
# 为什么有这个：盘点显示 AI Review 偶尔指出"DTO enum 扩展但 service 没处理"
# （PR #247 IntegrityCheckDto.scope 扩展为 4 值是典型）。这类问题确定性高
# 但用 TS 类型系统的 exhaustive check 才能稳定捕获——代码 base 里很多 switch
# 是 default 兜底而不是 exhaustive，类型系统不告警。本 hook 把"提醒人脑"
# 左移到 pre-commit。
#
# 当前 warn-only：盘点里这类 finding 不算高频，先观察再决定是否升级 block。
#
# 用法：bash scripts/ops/check-enum-extension.sh
#
# 已知限制：纯 grep heuristic 不解析 TS AST：
#   - 新增 enum 成员匹配 `^+  XXX = ` 或 `^+  XXX,` 形式
#   - 新增 union literal 匹配 `^+ .*\| ['"]xxx['"]`
#   - 不展开常量引用、不处理跨文件 union；过滤掉测试 / mock 文件减噪音
#
# 误报可能：新增字段名跟 enum 巧合（如 const ROLE_ADMIN = 'admin'）；
# 漏报可能：用类型别名 import 后扩展、批量改 enum 文件被滚动 grep 漏掉。

set -euo pipefail

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

STAGED=$(git diff --cached --name-only --diff-filter=AM -- \
  'backend/src/**/*.ts' 'frontend/src/**/*.ts' 2>/dev/null \
  | grep -vE '\.(spec|test|integration\.test)\.ts$' \
  | grep -vE '__mocks__|__tests__' \
  || true)
[ -z "$STAGED" ] && exit 0

declare -a HITS=()

for f in $STAGED; do
  [ -f "$f" ] || continue
  DIFF=$(git diff --cached --no-color -- "$f" 2>/dev/null)
  [ -z "$DIFF" ] && continue

  # 新增 enum 成员：行首 +、随后是 2-4 空格 + 大写 / 大写_下划线（保留 export 注释）
  # 排除注释行（// ...）和文档块（* ...）
  ENUM_ADDS=$(echo "$DIFF" | grep -E '^\+[[:space:]]+[A-Z][A-Z0-9_]*[[:space:]]*[=,]' \
    | grep -vE '^\+[[:space:]]*//' | grep -vE '^\+[[:space:]]*\*' || true)
  # 新增 union literal: 行首 + 且含 `| 'xxx'` 或 `| "xxx"`
  UNION_ADDS=$(echo "$DIFF" | grep -E "^\+.*\|[[:space:]]*['\"][a-zA-Z_][a-zA-Z0-9_-]*['\"]" || true)

  if [ -n "$ENUM_ADDS" ] || [ -n "$UNION_ADDS" ]; then
    HITS+=("$f")
    while IFS= read -r line; do [ -n "$line" ] && HITS+=("    $line"); done <<< "$ENUM_ADDS"
    while IFS= read -r line; do [ -n "$line" ] && HITS+=("    $line"); done <<< "$UNION_ADDS"
  fi
done

if [ ${#HITS[@]} -eq 0 ]; then
  exit 0
fi

echo "" >&2
echo "⚠️  Enum / union literal 扩展检测：${#HITS[@]} 个 hint" >&2
echo "下列文件包含新增 enum 成员或 union literal，请确认所有 consumer 同步处理：" >&2
echo "" >&2
for h in "${HITS[@]}"; do
  if [[ "$h" =~ ^\ {4} ]]; then
    echo "$h" >&2
  else
    echo "  📄 $h" >&2
  fi
done
echo "" >&2
echo "建议 grep 同模块 service / controller 看 switch / if-else / 默认值是否更新："
echo "  例：grep -rn 'YourEnum\.NEW_VALUE\|case .new-value.' backend/src/" >&2
echo "" >&2
echo "（warn-only，不阻断 commit）" >&2
exit 0
