"""results/*.json（run.py の出力）を条件ごとにまとめる。使い方: python summarize.py <results dir> [...]"""
import glob, json, os, statistics, sys
from collections import defaultdict

ORDER = {"low": 0, "medium": 1, "high": 2, "xhigh": 3, "max": 4}
rows = []
for d in sys.argv[1:]:
    for f in sorted(glob.glob(os.path.join(d, "*.json"))):
        rows.append(json.load(open(f)))

g = defaultdict(list)
for r in rows:
    g[(r["task"], r["tool"], r["effort"])].append(r)

out = []
for (task, tool, effort), rs in sorted(g.items(), key=lambda kv: (kv[0][0], kv[0][1], ORDER[kv[0][2]])):
    med = lambda k: statistics.median(r[k] for r in rs if k in r)
    out.append({
        "task": task, "tool": tool, "model": rs[0]["model"], "effort": effort, "n": len(rs),
        "wall_sec_median": round(med("wall_sec"), 1),
        "wall_sec_all": [r["wall_sec"] for r in rs],
        "cost_usd_median": round(med("cost_usd"), 4),
        "cost_usd_all": [r["cost_usd"] for r in rs],
        "input_tokens_median": int(statistics.median(r["tokens"]["input"] for r in rs)),
        "output_tokens_median": int(statistics.median(r["tokens"]["output"] for r in rs)),
        "turns_median": statistics.median(r["tokens"]["turns"] or 0 for r in rs),
        "visible_pass": sum(1 for r in rs if r["visible_pass"]),
        "hidden_all_pass": sum(1 for r in rs if r["hidden_pass"] == r["hidden_total"]),
        "hidden_min": min(r["hidden_pass"] for r in rs), "hidden_total": rs[0]["hidden_total"],
        "changed_lines_median": statistics.median(r["changed_lines"] for r in rs),
        "touched_tests": sum(1 for r in rs if r["touched_tests"]),
        "touched_legacy": sum(1 for r in rs if r["touched_legacy"]),
        "exit_nonzero": sum(1 for r in rs if r["exit"] != 0),
    })
json.dump(out, open("data/summary.json", "w"), ensure_ascii=False, indent=1)
print(f'{"task":4} {"tool":6} {"effort":6} n  wall(s)  cost$   inTok   outTok turns vis hid  lines')
for o in out:
    print(f'{o["task"]:4} {o["tool"]:6} {o["effort"]:6} {o["n"]}  {o["wall_sec_median"]:7} {o["cost_usd_median"]:7} {o["input_tokens_median"]:7} {o["output_tokens_median"]:6} {o["turns_median"]:5} {o["visible_pass"]}/{o["n"]} {o["hidden_all_pass"]}/{o["n"]} {o["changed_lines_median"]}')
