#!/usr/bin/env bash
# save-review-decision.sh —— 把「循环 review 每一轮的判断表」落盘为机器可读状态。
#
# 为什么需要它：
#   loop-review 的收敛靠「每条建议都有落点」（修复 commit / Won't fix / 误报）。
#   但判断表只存在于对话上下文里——会话一中断、上下文一压缩，上一轮的
#   「这条已 Won't fix / 这条已修复于 <hash>」记忆就丢了。bot 下轮原样重提，
#   于是又进入「改了又错、错了再改」的循环。
#   本脚本把判断表落盘到 .tmp-loop-review/decisions/，下次启动先读历史判断
#   去重，让「收敛」从「靠对话记忆」升级为「靠文件记忆」。
#
# 用法：
#   bash save-review-decision.sh <决策JSON>    # 写入一条决策
#
# 决策 JSON 格式（每条建议一个对象）：
#   {
#     "pr": "26",                   // PR 号
#     "id": "opus-1",               // 建议的唯一 ID（用于去重）
#     "severity": "critical",       // bot 标注，仅参考
#     "summary": "建议摘要",
#     "decision": "fixed|wontfix|false_alarm|deferred",
#     "reason": "判断理由",
#     "commit": "修复 commit hash（decision=fixed 时）"
#   }
#
# 查询（配对脚本 query-review-decision.sh）：
#   下轮启动时用 review_id / summary 查询是否已处理过，命中即跳过。

set -euo pipefail

DECISIONS_DIR="$(git rev-parse --show-toplevel)/.tmp-loop-review/decisions"
mkdir -p "$DECISIONS_DIR"

INPUT="${1:-}"
if [ -z "$INPUT" ]; then
  echo "用法: bash save-review-decision.sh '<决策JSON>'" >&2
  exit 1
fi

if ! jq -e . <<<"$INPUT" >/dev/null 2>&1; then
  echo "错误: 输入不是合法 JSON" >&2
  exit 1
fi

PR="$(jq -r '.pr // empty' <<<"$INPUT")"
if [ -z "$PR" ]; then
  echo "错误: JSON 缺少 pr 字段" >&2
  exit 1
fi

DECISION_FILE="$DECISIONS_DIR/pr-$PR.decisions.json"

# 追加/合并：已存在该 id 则覆盖，否则追加
if [ -f "$DECISION_FILE" ]; then
  MERGED="$(jq --argjson new "$INPUT" '
    .decisions as $old |
    ([$old[] | select(.id != $new.id)] + [$new]) |
    { pr: $new.pr, decisions: . }
  ' "$DECISION_FILE")"
else
  MERGED="$(jq -n --argjson new "$INPUT" '{ pr: $new.pr, decisions: [$new] }')"
fi

printf '%s\n' "$MERGED" > "$DECISION_FILE"
echo "✅ 已写入 $DECISION_FILE"