#!/bin/bash
# =============================================================================
# 并发防超卖压测
# 场景：20 个并发连接同时抢同一房间同一晚（库存=1）
# 预期：恰好 1 个成功，19 个失败；最终 sold_qty=1，绝不超卖
# =============================================================================
set -u
DB=rental_design_verify
ROOM_ID=$(psql -d $DB -tAc "select id from room where room_no='A-101';" | tr -d ' ')
TARGET_DATE='2026-11-09'
CONCURRENCY=20

echo "房间ID=$ROOM_ID  目标日期=$TARGET_DATE  并发数=$CONCURRENCY"
echo "调整库存：total_qty=1, sold_qty=0"
psql -d $DB -q -c "UPDATE room_calendar SET total_qty=1, sold_qty=0 WHERE room_id=$ROOM_ID AND biz_date='$TARGET_DATE';"

rm -f /tmp/conc_result_*.txt
echo "开始并发抢占..."

for i in $(seq 1 $CONCURRENCY); do
  (
    # 每个连接独立事务，尝试占 1 晚
    out=$(psql -d $DB -tA -v ON_ERROR_STOP=1 -c \
      "SELECT fn_hold_room_nights($ROOM_ID, '$TARGET_DATE'::date, '$TARGET_DATE'::date + 1, 1::smallint);" 2>&1)
    if [ "$out" = "t" ]; then
      echo "OK" > /tmp/conc_result_$i.txt
    else
      echo "FAIL" > /tmp/conc_result_$i.txt
    fi
  ) &
done
wait

OK=$(grep -l "^OK$" /tmp/conc_result_*.txt 2>/dev/null | wc -l | tr -d ' ')
FAIL=$(grep -l "^FAIL$" /tmp/conc_result_*.txt 2>/dev/null | wc -l | tr -d ' ')
SOLD=$(psql -d $DB -tAc "select sold_qty from room_calendar where room_id=$ROOM_ID and biz_date='$TARGET_DATE';" | tr -d ' ')

echo ""
echo "================ 并发压测结果 ================"
echo "成功抢占数 : $OK   （期望 1）"
echo "失败数     : $FAIL   （期望 $((CONCURRENCY-1))）"
echo "最终已售数 : $SOLD   （期望 1，若 >1 即发生超卖）"
echo ""
if [ "$OK" = "1" ] && [ "$SOLD" = "1" ]; then
  echo "✅ 结论：并发下未发生超卖，防超卖设计成立"
  exit 0
else
  echo "❌ 结论：发生超卖或异常，设计需修正"
  exit 1
fi
