#!/usr/bin/env bash
# dual-dev-compare.sh — 双开发对比分析
# 用法: bash scripts/dual-dev-compare.sh <opencode-metrics.json> <xwcode-metrics.json> <output-report.md>
#
# 读取两个开发者的指标 JSON,生成 Markdown 对比报告 + 诊断分析。
# 这是双开发对比验证机制的核心脚本,跨版本可复用。
set -euo pipefail

OPENCODE_JSON="${1:?Usage: dual-dev-compare.sh <opencode-metrics.json> <xwcode-metrics.json> <output-report.md>}"
XWCODE_JSON="${2:?Missing xwcode-metrics.json}"
REPORT="${3:?Missing output-report.md}"

echo "=== dual-dev-compare ==="

# 解析 JSON
eval "$(python3 -c "
import json, sys

with open('$OPENCODE_JSON') as f:
    oc = json.load(f)
with open('$XWCODE_JSON') as f:
    xw = json.load(f)

def j(v): return 'true' if v else 'false'

# Git
print(f'OC_COMMITS={oc[\"git\"][\"commit_count\"]}')
print(f'OC_FILES={oc[\"git\"][\"files_changed\"]}')
print(f'OC_LINES_ADD={oc[\"git\"][\"lines_added\"]}')
print(f'OC_LINES_RM={oc[\"git\"][\"lines_removed\"]}')
print(f'XW_COMMITS={xw[\"git\"][\"commit_count\"]}')
print(f'XW_FILES={xw[\"git\"][\"files_changed\"]}')
print(f'XW_LINES_ADD={xw[\"git\"][\"lines_added\"]}')
print(f'XW_LINES_RM={xw[\"git\"][\"lines_removed\"]}')

# Process
print(f'OC_EDIT_CALLS={oc[\"process\"][\"edit_file_calls\"]}')
print(f'OC_BASH_WRITES={oc[\"process\"][\"bash_write_ops\"]}')
print(f'OC_TASK_COMPLETE={j(oc[\"process\"][\"task_complete_called\"])}')
print(f'OC_TOKENS={oc[\"process\"][\"token_usage\"]}')
print(f'OC_ELAPSED={oc[\"process\"][\"elapsed_minutes\"]}')
print(f'XW_EDIT_CALLS={xw[\"process\"][\"edit_file_calls\"]}')
print(f'XW_BASH_WRITES={xw[\"process\"][\"bash_write_ops\"]}')
print(f'XW_TASK_COMPLETE={j(xw[\"process\"][\"task_complete_called\"])}')
print(f'XW_TOKENS={xw[\"process\"][\"token_usage\"]}')
print(f'XW_ELAPSED={xw[\"process\"][\"elapsed_minutes\"]}')

# Quality
print(f'OC_FMT={j(oc[\"quality_gates\"][\"cargo_fmt_pass\"])}')
print(f'OC_CLIPPY={j(oc[\"quality_gates\"][\"cargo_clippy_pass\"])}')
print(f'OC_TEST={j(oc[\"quality_gates\"][\"cargo_test_pass\"])}')
print(f'XW_FMT={j(xw[\"quality_gates\"][\"cargo_fmt_pass\"])}')
print(f'XW_CLIPPY={j(xw[\"quality_gates\"][\"cargo_clippy_pass\"])}')
print(f'XW_TEST={j(xw[\"quality_gates\"][\"cargo_test_pass\"])}')

# Branch info
print(f'OC_BRANCH={oc[\"branch\"]}')
print(f'XW_BRANCH={xw[\"branch\"]}')
print(f'OC_BASE={oc[\"base_tag\"]}')
print(f'XW_BASE={xw[\"base_tag\"]}')
" 2>/dev/null)"

# ── 诊断分析 ──
DIAGNOSES=""

# D1: bash 写文件绕过
if [ "$XW_BASH_WRITES" -gt 0 ]; then
    DIAGNOSES="${DIAGNOSES}
### D1: bash 写文件绕过
- **xwcode-dev**: ${XW_BASH_WRITES} 次 bash 写操作
- **opencode-dev**: ${OC_BASH_WRITES} 次 bash 写操作
- **诊断**: xwcode-dev 仍存在 bash 写文件绕过,SafetyChecker/G2 修复未生效或不足
- **建议**: 检查 SafetyChecker 拦截正则是否覆盖实际使用的写模式;评估是否需要编辑层硬约束
"
fi

# D2: edit_file 调用差距
EDIT_RATIO=0
if [ "$OC_EDIT_CALLS" -gt 0 ]; then
    EDIT_RATIO=$(( XW_EDIT_CALLS * 100 / OC_EDIT_CALLS ))
fi
if [ "$EDIT_RATIO" -lt 50 ]; then
    DIAGNOSES="${DIAGNOSES}
### D2: edit_file 使用率不足
- **xwcode-dev**: ${XW_EDIT_CALLS} 次 edit_file 调用
- **opencode-dev**: ${OC_EDIT_CALLS} 次 edit_file 调用
- **比率**: xwcode/opencode = ${EDIT_RATIO}%
- **诊断**: xwcode-dev 对 edit_file 的信任度或可用性不足,可能原因:Diagnose abandon (G1)、模型偏好 bash
- **建议**: G1 修复后重测;如果 edit_file 可用但模型仍偏好 bash,需要更强工具选择引导
"
fi

# D3: task_complete 未调用
if [ "$XW_TASK_COMPLETE" = "false" ] && [ "$OC_TASK_COMPLETE" = "true" ]; then
    DIAGNOSES="${DIAGNOSES}
### D3: task_complete 未主动调用
- **xwcode-dev**: 未调用
- **opencode-dev**: 已调用
- **诊断**: xwcode-dev 缺少任务完成意识,可能原因:系统提示中 task_complete 引导不足、模型未理解退出条件
- **建议**: 强化系统提示中 task_complete 的使用引导;考虑在 LoopMonitor 中增加完成检测
"
fi

# D4: 质量门禁差距
GATE_FAILS=""
if [ "$XW_FMT" = "false" ]; then GATE_FAILS="${GATE_FAILS} fmt"; fi
if [ "$XW_CLIPPY" = "false" ]; then GATE_FAILS="${GATE_FAILS} clippy"; fi
if [ "$XW_TEST" = "false" ]; then GATE_FAILS="${GATE_FAILS} test"; fi
if [ -n "$GATE_FAILS" ]; then
    DIAGNOSES="${DIAGNOSES}
### D4: 质量门禁未通过
- **xwcode-dev 失败项**: ${GATE_FAILS}
- **诊断**: xwcode-dev 产出的代码质量不足,可能原因:缺少自检步骤、cargo check 反馈未有效利用
- **建议**: 在编辑后强制 cargo check;clippy/test 失败时自动重试修复
"
fi

# D5: 代码量差距(可能暗示实现不完整)
TOTAL_OC=$(( OC_LINES_ADD + OC_LINES_RM ))
TOTAL_XW=$(( XW_LINES_ADD + XW_LINES_RM ))
if [ "$TOTAL_OC" -gt 0 ]; then
    CODE_RATIO=$(( TOTAL_XW * 100 / TOTAL_OC ))
    if [ "$CODE_RATIO" -lt 30 ] || [ "$CODE_RATIO" -gt 300 ]; then
        DIAGNOSES="${DIAGNOSES}
### D5: 代码量异常差距
- **opencode-dev**: ${TOTAL_OC} 行变更(+${OC_LINES_ADD}/-${OC_LINES_RM})
- **xwcode-dev**: ${TOTAL_XW} 行变更(+${XW_LINES_ADD}/-${XW_LINES_RM})
- **比率**: xwcode/opencode = ${CODE_RATIO}%
- **诊断**: 代码量差距过大,可能原因:实现不完整(<30%)或过度修改(>300%)
- **建议**: 逐功能对照 G1/G2/G3 验收标准,检查是否有遗漏或冗余
"
    fi
fi

if [ -z "$DIAGNOSES" ]; then
    DIAGNOSES="
### ✅ 无显著差距
两个开发者的过程指标和质量指标均对齐,双开发对比未发现结构性问题。
"
fi

# ── 生成报告 ──
cat > "$REPORT" <<REPORT_EOF
# 双开发对比报告 — ${OC_BASE}

> **生成时间**: $(date -Iseconds)
> **基准版本**: ${OC_BASE}
> **opencode-dev 分支**: ${OC_BRANCH}
> **xwcode-dev 分支**: ${XW_BRANCH}

---

## 1. 对比总览

| 指标 | opencode-dev | xwcode-dev | 差距 |
|------|:-----------:|:-----------:|:----:|
| 提交数 | ${OC_COMMITS} | ${XW_COMMITS} | — |
| 变更文件数 | ${OC_FILES} | ${XW_FILES} | — |
| 增删行数 | +${OC_LINES_ADD}/-${OC_LINES_RM} | +${XW_LINES_ADD}/-${XW_LINES_RM} | — |
| edit_file 调用 | ${OC_EDIT_CALLS} | ${XW_EDIT_CALLS} | $([ "$OC_EDIT_CALLS" -gt 0 ] && echo "$(( XW_EDIT_CALLS * 100 / OC_EDIT_CALLS ))%" || echo "N/A") |
| bash 写操作 | ${OC_BASH_WRITES} | ${XW_BASH_WRITES} | — |
| task_complete | ${OC_TASK_COMPLETE} | ${XW_TASK_COMPLETE} | — |
| Token 消耗 | ${OC_TOKENS} | ${XW_TOKENS} | — |
| 开发耗时 | ${OC_ELAPSED}min | ${XW_ELAPSED}min | — |

## 2. 质量门禁

| 门禁 | opencode-dev | xwcode-dev |
|------|:-----------:|:-----------:|
| cargo fmt | ${OC_FMT} | ${XW_FMT} |
| cargo clippy | ${OC_CLIPPY} | ${XW_CLIPPY} |
| cargo test | ${OC_TEST} | ${XW_TEST} |

## 3. 诊断分析

${DIAGNOSES}

## 4. 合并建议

基于以上对比分析,给出合并策略建议:

- 若 xwcode-dev 质量门禁全绿且功能完整 → 考虑 squash 合并或 cherry-pick
- 若 xwcode-dev 有特定改进(如更优算法/更少代码)→ 从 xwcode-dev cherry-pick 到 opencode-dev 基准
- 若 xwcode-dev 产出不可用 → 保留分支作诊断样本,以 opencode-dev 为基准

---

*报告由 dual-dev-compare.sh 自动生成*
REPORT_EOF

echo ""
echo "=== comparison report generated ==="
echo "output: $REPORT"