#!/usr/bin/env bash
# dual-dev-metrics.sh — 收集双开发对比指标
# 用法: bash scripts/dual-dev-metrics.sh <branch> <work-dir> <output-json>
#
# 从 git 分支和 EventLog/诊断数据中提取过程指标,
# 输出 JSON 供 dual-dev-compare.sh 对比分析。
#
# 指标项:
#   - commit_count: 提交数
#   - files_changed: 变更文件数
#   - lines_added/lines_removed: 增删行数
#   - edit_file_calls: edit_file 调用次数(从诊断 trace 提取)
#   - bash_write_ops: bash 写操作次数(从诊断 trace 提取)
#   - task_complete_called: task_complete 是否主动调用
#   - cargo_fmt_pass: fmt 是否通过
#   - cargo_clippy_pass: clippy 是否通过
#   - cargo_test_pass: test 是否通过
#   - elapsed_minutes: 开发耗时(分钟)
#   - token_usage: token 消耗(从诊断 trace 提取)
set -euo pipefail

BRANCH="${1:?Usage: dual-dev-metrics.sh <branch> <work-dir> <output-json>}"
WORK_DIR="${2:?Missing work-dir}"
OUTPUT="${3:?Missing output-json}"

echo "=== dual-dev-metrics ==="
echo "branch:   $BRANCH"
echo "work-dir: $WORK_DIR"
echo "output:   $OUTPUT"

cd "$WORK_DIR"

# 确保在正确分支
CURRENT=$(git branch --show-current)
if [ "$CURRENT" != "$BRANCH" ]; then
    echo "ERROR: current branch is '$CURRENT', expected '$BRANCH'"
    exit 1
fi

# ── 1. Git 指标 ──
BASE_TAG="v0.85.0"
COMMIT_COUNT=$(git log --oneline "${BASE_TAG}..HEAD" | wc -l)
FILES_CHANGED=$(git diff --name-only "${BASE_TAG}..HEAD" | wc -l)
LINES_ADDED=$(git diff --shortstat "${BASE_TAG}..HEAD" | grep -oP '\d+(?= insertion)' || echo 0)
LINES_REMOVED=$(git diff --shortstat "${BASE_TAG}..HEAD" | grep -oP '\d+(?= deletion)' || echo 0)

# ── 2. 诊断 trace 指标(如果存在)──
DIAG_DIR="${WORK_DIR}/.xwcode/diagnostic"
EDIT_FILE_CALLS=0
BASH_WRITE_OPS=0
TASK_COMPLETE_CALLED=false
TOKEN_USAGE=0
ELAPSED_MINUTES=0

if [ -d "$DIAG_DIR" ]; then
    # 从 comm.jsonl 提取 task_complete
    COMM_JSONL="${DIAG_DIR}/comm.jsonl"
    if [ -f "$COMM_JSONL" ]; then
        if grep -q "task_complete" "$COMM_JSONL" 2>/dev/null; then
            TASK_COMPLETE_CALLED=true
        fi
    fi

    # 从 event_log.jsonl 提取工具调用统计
    EVENT_LOG="${DIAG_DIR}/event_log.jsonl"
    if [ -f "$EVENT_LOG" ]; then
        EDIT_FILE_CALLS=$(grep -c '"edit_file"' "$EVENT_LOG" 2>/dev/null || echo 0)
        # bash 写操作: sed -i, echo >>, awk -i inplace, tee, cat >, dd
        BASH_WRITE_OPS=$(grep -cE '"(sed.*-i|echo.*>>|awk.*-i inplace|tee|cat\s*>|dd\s+of=)"' "$EVENT_LOG" 2>/dev/null || echo 0)
    fi

    # 从 turn_summaries.jsonl 提取 token 和耗时
    TURN_SUM="${DIAG_DIR}/turn_summaries.jsonl"
    if [ -f "$TURN_SUM" ]; then
        # token: 取 total_tokens 总和
        TOKEN_USAGE=$(python3 -c "
import json, sys
total = 0
with open('$TURN_SUM') as f:
    for line in f:
        try:
            d = json.loads(line)
            total += d.get('total_tokens', 0)
        except: pass
print(total)
" 2>/dev/null || echo 0)
    fi
fi

# ── 3. 质量门禁 ──
CARGO_FMT_PASS=false
CARGO_CLIPPY_PASS=false
CARGO_TEST_PASS=false

# fmt check
if cargo fmt --all --check 2>/dev/null; then
    CARGO_FMT_PASS=true
fi

# clippy check
if cargo clippy --all-targets -- -D warnings 2>/dev/null; then
    CARGO_CLIPPY_PASS=true
fi

# test check(v1.7.4 AC4 · 承 09-26 口径): 裸 `cargo test` ⇒ `cargo nextest run -j 32 --no-fail-fast`
# ★ 出口码之变(一手实测 · nextest 0.9.143): `0` = 有测试且全绿; `4` = **无测试**(主线
#   `[workspace] members = []` 之结构性零覆盖 ⇒ **非红**; 照实标注, 不得读作「全绿」); 余 = 红。
_nt_rc=0
cargo nextest run --workspace -j 32 --no-fail-fast >/dev/null 2>&1 || _nt_rc=$?
case "$_nt_rc" in
    0) CARGO_TEST_PASS=true ;;
    4) CARGO_TEST_PASS=true
       echo "[dual-dev-metrics] ★ nextest rc=4 —— 0 tests(结构性零覆盖 · 非绿非红 · 照实)" >&2 ;;
    *) CARGO_TEST_PASS=false ;;
esac

# ── 4. 输出 JSON ──
cat > "$OUTPUT" <<EOF
{
  "branch": "$BRANCH",
  "base_tag": "$BASE_TAG",
  "timestamp": "$(date -Iseconds)",
  "git": {
    "commit_count": $COMMIT_COUNT,
    "files_changed": $FILES_CHANGED,
    "lines_added": $LINES_ADDED,
    "lines_removed": $LINES_REMOVED
  },
  "process": {
    "edit_file_calls": $EDIT_FILE_CALLS,
    "bash_write_ops": $BASH_WRITE_OPS,
    "task_complete_called": $TASK_COMPLETE_CALLED,
    "token_usage": $TOKEN_USAGE,
    "elapsed_minutes": $ELAPSED_MINUTES
  },
  "quality_gates": {
    "cargo_fmt_pass": $CARGO_FMT_PASS,
    "cargo_clippy_pass": $CARGO_CLIPPY_PASS,
    "cargo_test_pass": $CARGO_TEST_PASS
  }
}
EOF

echo ""
echo "=== metrics collected ==="
cat "$OUTPUT"