#!/bin/bash
# 自测 .claude/hooks/post-figma-write.sh 的「未机检的写」marker（2026-09-09）。
#
# ⛔ 为什么必须有这个文件：post-figma-write 在缺 fileKey / 未定位仓库时**不会**发起后台机检，
#    此前只留一句 systemMessage ⇒ 写了却零机检的 session 在 Stop 时静默放行。
#    本自测钉住：写信号 + 无 fileKey ⇒ 必须落 marker（供 stop-figma-conformance.sh 第 ③ 段消费）；
#    只读调用 ⇒ 不落 marker（⛔ 别打扰纯读 session）。
#
# ⚠️ 只测**不发起后台 run**的分支（无 fileKey）。发起分支要 Figma token + 真 fileKey，不在此验。
# 用法：bash .claude/hooks/post-figma-write.selftest.sh
set -u
HOOK="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/post-figma-write.sh"
PASS=0
FAIL=0
EC=0
check() { # $1 = 名称 ; $2 = 条件结果(0/1)
  if [ "$2" -eq 0 ]; then
    PASS=$((PASS + 1)); echo "  ✓ $1"
  else
    FAIL=$((FAIL + 1)); echo "  ✗ $1"
  fi
}
run_hook() { # $1 = session_id ; $2 = JSON 字面量（含引号）的 code
  printf '{"session_id":"%s","hook_event_name":"PostToolUse","tool_input":{"code":%s}}' "$1" "$2" \
    | env -u CLAUDE_PROJECT_DIR -u TVU_DESIGN_SYSTEM_PATH bash "$HOOK" > /dev/null 2>&1
  EC=$?
}
lines() { [ -f "$1" ] && wc -l < "$1" | tr -d ' ' || echo 0; }

S="selftest-pfw-$$"
SD="${TMPDIR:-/tmp}/tvu-mockup-conformance/$S"
rm -rf "$SD"

echo "▶ 自测 post-figma-write.sh"

# ── PN1 只读 code（无写信号）⇒ 放行且不落 marker ─────────────────────────────
run_hook "$S" '"const n = figma.getNodeById(\"1:2\"); console.log(n.name)"'
check "PN1 只读 code ⇒ exit 0" "$([ "$EC" -eq 0 ] && echo 0 || echo 1)"
check "PN1′ 且不落 marker" "$([ ! -f "$SD/unchecked-writes" ] && echo 0 || echo 1)"

# ── PH1 写信号 + 无 fileKey ⇒ PostToolUse 不拦（exit 0），但 marker 记 1 行 ────
run_hook "$S" '"const f = figma.createFrame(); f.name = \"x\""'
check "PH1 写 code + 无 fileKey ⇒ exit 0（PostToolUse 结构上不拦）" "$([ "$EC" -eq 0 ] && echo 0 || echo 1)"
check "PH1′ 且 marker 1 行" "$([ "$(lines "$SD/unchecked-writes")" = "1" ] && echo 0 || echo 1)"
check "PH1″ 且写明原因 no-filekey" "$(grep -q 'no-filekey' "$SD/unchecked-writes" 2>/dev/null && echo 0 || echo 1)"

# ── PH2 第二次写 ⇒ marker 追加为 2 行（每次写各一行，供 Stop 点出次数）─────────
run_hook "$S" '"figma.getNodeById(\"3:4\").resize(10,10)"'
check "PH2 第二次写 ⇒ marker 2 行" "$([ "$(lines "$SD/unchecked-writes")" = "2" ] && echo 0 || echo 1)"

# ── PN2 写之后再来一次只读 ⇒ marker 不变（只读不算）────────────────────────────
run_hook "$S" '"figma.currentPage.findAll(n => n.type === \"TEXT\").length"'
check "PN2 只读不追加 marker（仍 2 行）" "$([ "$(lines "$SD/unchecked-writes")" = "2" ] && echo 0 || echo 1)"

rm -rf "$SD"
echo "▶ 自测：$PASS 过 / $FAIL 失败"
[ "$FAIL" -eq 0 ] || exit 1
exit 0
