#!/usr/bin/env bash
# check-consumer-ack.sh — v1.7.8 minimal version
#
# Pre-publish hook: 验证 consumer ack 文档存在，确保按 protocol-version-coevolution skill
# Principle 5（Decouple reply from implementation）的纪律走 Round 2-N reply round 后才 publish.
#
# 设计来源：
#   - 协议方 reply: claude-docs/discussions/protocol-team-reply-to-broadcast-gap-v1.7.8.md §5.1
#   - 设备端建议: claude-docs/discussions/device-team-suggestion-escape-hatch-telemetry-v1.7.8.md
#   - 协议方 ack: claude-docs/discussions/protocol-team-ack-of-escape-hatch-suggestion-v1.7.8.md §1.1 最小版
#   - 设备端 final ack: claude-docs/discussions/device-team-final-ack-v1.7.8.md §1
#
# Escape hatch: SKIP_CONSUMER_ACK=1 + 写审计日志 + 文本 banner
#   仅在 "pure process fix 不涉及 wire schema" 场景使用，需 CHANGELOG 自首.

set -euo pipefail

VERSION=$(node -p "require('./package.json').version")

# 主仓 discussions 路径（默认假设 protocol pkg 在 services/jrsoft-subway-protocol/ 下，主仓根在 ../..）
DISCUSSIONS_DIR="${MONOREPO_ROOT:-../..}/claude-docs/discussions"

ACK_FILE="${DISCUSSIONS_DIR}/device-team-ack-of-protocol-reply-v${VERSION}.md"
FINAL_ACK_FILE="${DISCUSSIONS_DIR}/device-team-final-ack-v${VERSION}.md"
# 语义后缀 ack pattern（如 -broadcast-gap-v1.7.8 / -meta-gap-v1.7.7）
ALT_PATTERN="${DISCUSSIONS_DIR}/device-team-ack-of-protocol-reply-*-v${VERSION}.md"
# v1.8.5: final-ack 带 informative 后缀模式（如 -of-progress-update-status-invariant-v1.8.5）
# 协议方 owner 担责扩展, 因为 informative 命名比无后缀更精确 (多 cycle 在同一版本下时区分)
FINAL_ALT_PATTERN="${DISCUSSIONS_DIR}/device-team-final-ack-*-v${VERSION}.md"
# v1.10.0: final-ack 带 round 后缀模式（如 -v1.10.0-round-2）
# 设备端 v1.10.0 cycle 启用 Round-N 文件命名规范, hook 需识别此格式
FINAL_ROUND_PATTERN="${DISCUSSIONS_DIR}/device-team-final-ack-v${VERSION}-round-*.md"

AUDIT_LOG="scripts/escape-hatch-audit.jsonl"

write_audit_entry() {
    local action="$1"
    local user="$(git config user.email 2>/dev/null || echo unknown)"
    local timestamp="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
    echo "{\"timestamp\":\"${timestamp}\",\"version\":\"${VERSION}\",\"action\":\"${action}\",\"user\":\"${user}\",\"ci\":\"${CI:-false}\"}" >> "$AUDIT_LOG"
}

# 1. PASS — ack doc 存在（标准命名 / final ack / 语义后缀 / final-ack 后缀 任一）
if [ -f "$ACK_FILE" ] || [ -f "$FINAL_ACK_FILE" ] \
    || compgen -G "$ALT_PATTERN" > /dev/null \
    || compgen -G "$FINAL_ALT_PATTERN" > /dev/null \
    || compgen -G "$FINAL_ROUND_PATTERN" > /dev/null; then
    echo "✅ check:consumer-ack  found ack doc for v${VERSION}"
    write_audit_entry "PASS"
    exit 0
fi

# 2. ESCAPE_HATCH_USED — 显式 SKIP_CONSUMER_ACK=1 跳过
if [ "${SKIP_CONSUMER_ACK:-}" = "1" ]; then
    write_audit_entry "ESCAPE_HATCH_USED"
    echo ""
    echo "================================================================"
    echo "  ⚠️  ESCAPE HATCH USED — SKIP_CONSUMER_ACK=1"
    echo "================================================================"
    echo "  Version:      v${VERSION}"
    echo "  Expected ack: $ACK_FILE"
    echo "  Or any of:    $FINAL_ACK_FILE"
    echo "                $ALT_PATTERN"
    echo ""
    echo "  Requirements before continuing:"
    echo "    1. CHANGELOG.md MUST self-disclose escape hatch use"
    echo "    2. Audit log written to scripts/escape-hatch-audit.jsonl"
    echo "    3. Reason MUST be documented (e.g., 'pure process fix')"
    echo ""
    echo "  Per skill Principle 5 + ack v1.7.8: use sparingly. Monthly review applies."
    echo "================================================================"
    echo ""
    exit 0
fi

# 3. FAILED_NO_ACK — 文档不存在且无 escape hatch → 阻塞 publish
echo "❌ check:consumer-ack  no ack doc for v${VERSION}"
echo "   Expected one of:"
echo "     - $ACK_FILE"
echo "     - $FINAL_ACK_FILE"
echo "     - $ALT_PATTERN  (pattern, e.g., -broadcast-gap-v${VERSION}.md)"
echo "     - $FINAL_ALT_PATTERN  (pattern, e.g., -of-progress-update-status-invariant-v${VERSION}.md)"
echo ""
echo "   Per protocol-version-coevolution skill Principle 5:"
echo "     Implementation must follow consumer reply round."
echo "     Round 2 reply → Round N ack → publish."
echo ""
echo "   To bypass (only for pure process fixes not touching wire schema):"
echo "     SKIP_CONSUMER_ACK=1 npm publish"
echo "   This will be logged in scripts/escape-hatch-audit.jsonl + must be"
echo "   self-disclosed in CHANGELOG.md. Use sparingly."
echo ""

write_audit_entry "FAILED_NO_ACK"
exit 1
