#!/usr/bin/env bash
# 迁移文件数量校验 (#259 B4)：staged 新增的迁移目录数必须 ≤ 1。
#
# 为什么有这个：CLAUDE.md「数据库」段规定"每次提交最多包含一个迁移文件"。
# CI 端 .gitea/workflows/quality-gates.yml 的 migration-file-count job 是
# PR-level 兜底，但本地 commit 之前没人拦——会等到 PR 阶段才发现违反，
# 来回返工成本高。本脚本把 CI 检查左移到 pre-commit。
#
# 用法：
#   bash scripts/ops/check-migration-count.sh         # 默认 block 模式
#   bash scripts/ops/check-migration-count.sh --mode warn  # 仅警告（特殊场景）
#
# 取舍：默认 block 因为这是 CLAUDE.md 明文规则，不是探索期；warn 模式
# 留给极端场景（如批量合并多个独立迁移的运维操作）。

set -euo pipefail

MODE="block"
while [[ $# -gt 0 ]]; do
  case "$1" in
    --mode) MODE="$2"; shift 2 ;;
    -h|--help) sed -n '2,15p' "$0" | sed 's/^# \?//'; exit 0 ;;
    *) echo "未知参数: $1" >&2; exit 2 ;;
  esac
done

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

# 只看新增 migration.sql；改既有迁移由其他规则（"不得改已应用迁移"）覆盖
STAGED=$(git diff --cached --name-only --diff-filter=A -- 'backend/prisma/migrations/*/migration.sql' 2>/dev/null || true)
if [ -z "$STAGED" ]; then
  exit 0
fi

# 按目录去重计数（避免一个目录两个 migration.sql 算两次，极少见但保险）
MIG_DIRS=$(echo "$STAGED" | awk -F/ '{print $4}' | sort -u)
COUNT=$(echo "$MIG_DIRS" | grep -c .)

if [ "$COUNT" -le 1 ]; then
  exit 0
fi

echo "" >&2
echo "❌ 一个 commit 最多包含一个新的迁移目录（CLAUDE.md 数据库规则）" >&2
echo "本次 staged 包含 $COUNT 个迁移目录：" >&2
echo "$MIG_DIRS" | sed 's/^/  - /' >&2
echo "" >&2
echo "解决：" >&2
echo "  1. 把多个迁移合并成一个 (npx prisma migrate dev 重新生成单文件)" >&2
echo "  2. 或拆成多个独立 commit / PR，每个一个迁移" >&2

if [ "$MODE" = "block" ]; then
  exit 1
fi
echo "（当前 mode=warn，不阻断 commit）" >&2
exit 0
