#!/bin/bash
# =============================================================================
# 一键复现脚本：从空库开始，按文档顺序建库 → 建表 → 验证
# 用途：证明交付的 DDL 可完整复现，不是一次性产物
# =============================================================================
set -u
DIR="$(cd "$(dirname "$0")" && pwd)"
DB="${1:-rental_design_verify}"
MODE="${2:-full}"

echo "=============================================="
echo " 房屋租赁 SaaS · 数据库一键复现"
echo " 目标库：$DB"
echo "=============================================="
echo ""

# ---------- 步骤 0：重建空库 ----------
echo "[0/5] 重建空库..."
dropdb --if-exists "$DB" 2>/dev/null
if ! createdb "$DB"; then
  echo "❌ 建库失败"
  exit 1
fi
echo "      ✅ 空库已就绪"

# ---------- 步骤 1：建表 ----------
echo ""
echo "[1/5] 执行 DDL（4 份）..."
FAILED=0
for f in 01-平台租户房源.sql 02-租客合同收租.sql 03-工单IoT媒体AR-Agent.sql 04-约束与并发保障.sql; do
  if psql -d "$DB" -q -v ON_ERROR_STOP=1 -f "$DIR/$f" > /tmp/ddl_out.txt 2>&1; then
    echo "      ✅ $f"
  else
    echo "      ❌ $f"
    tail -5 /tmp/ddl_out.txt
    FAILED=1
  fi
done
[ $FAILED -ne 0 ] && exit 1

# ---------- 步骤 2：统计 ----------
echo ""
echo "[2/5] 对象统计..."
psql -d "$DB" -tAc "select '      表: ' || count(*) from information_schema.tables where table_schema='public' and table_type='BASE TABLE';"
psql -d "$DB" -tAc "select '      索引: ' || count(*) from pg_indexes where schemaname='public';"
psql -d "$DB" -tAc "select '      外键: ' || count(*) from pg_constraint where contype='f' and connamespace='public'::regnamespace;"
psql -d "$DB" -tAc "select '      CHECK约束: ' || count(*) from pg_constraint where contype='c' and connamespace='public'::regnamespace;"
psql -d "$DB" -tAc "select '      排他约束: ' || count(*) from pg_constraint where contype='x';"
psql -d "$DB" -tAc "select '      库大小: ' || pg_size_pretty(pg_database_size('$DB'));"

if [ "$MODE" = "schema-only" ]; then
  echo ""
  echo "✅ 仅建表模式完成（跳过数据验证）"
  exit 0
fi

# ---------- 步骤 3：数据验证 ----------
echo ""
echo "[3/5] 真实数据验证（15 用例）..."
psql -d "$DB" -f "$DIR/05-真实数据验证.sql" > /tmp/verify_out.txt 2>&1
PASS=0; FAIL=0
# 统计预期报错的用例（这些是"正确拦截"的证明）
for kw in "库存不足" "核销超额" "uq_payment_trade_no" "uq_bill_idempotency" "exclusion constraint"; do
  if grep -q "$kw" /tmp/verify_out.txt; then
    PASS=$((PASS+1))
  else
    FAIL=$((FAIL+1)); echo "      ⚠️  未观察到预期拦截: $kw"
  fi
done
if grep -q "status=paid\|paid | t" /tmp/verify_out.txt || grep -qE "paid\s*\|\s*t" /tmp/verify_out.txt; then
  PASS=$((PASS+1)); echo "      ✅ 账单状态机推进到 paid"
fi
echo "      关键拦截点验证通过: $PASS 项"

# ---------- 步骤 4：并发压测 ----------
echo ""
echo "[4/5] 并发压测（20 并发抢 1 库存）..."
bash "$DIR/06-并发防超卖压测.sh" 2>&1 | grep -E "成功抢占数|失败数|最终已售数|结论"

# ---------- 步骤 5：完成 ----------
echo ""
echo "[5/5] 复现完成"
echo "=============================================="
echo " 全部步骤执行完毕"
echo "=============================================="
