"""세 재판정 대조 — 되돌릴 후보를 뽑는다.

  v1  Gemini 단독                    (대조군을 두 번 틀린 심판)
  v2  Opus+Sol 이중, 92건이 sanitize 된 입력으로 판정됨
  v3  Opus+Sol 이중, 전부 원래 입력  ← 신뢰 기준

v2↔v3 차이가 곧 **sanitize 된 입력이 판정을 얼마나 흔들었는가**다. 같은
심판·같은 이미지인데 입력 프롬프트만 달랐으므로, 여기서 갈린 건수는 Tier 2
강등이 만든 오차의 하한이다.

되돌릴 후보는 **v1 ∩ v3** 로 뽑는다. 되돌리기는 비가역이므로 서로 독립인 두
판정이 함께 "개악"이라 한 것만 손댄다. 한쪽만 개악이라 한 것은 어느 쪽이
옳은지 모르므로 남긴다 — 잘못 되돌리면 더 나은 그림이 더 나쁜 그림이 된다.
"""
from __future__ import annotations

import json
import re
import sys
from pathlib import Path


def load(p: str) -> dict:
    d = json.loads(Path(p).read_text("utf-8"))
    d = d.get("results", d)
    return {k: v for k, v in d.items() if isinstance(v, dict) and "winner" in v}


def key(s: str):
    m = re.findall(r"\d+", s)
    return (int(m[0]), int(m[1])) if len(m) >= 2 else (9999, 9999)


def main() -> None:
    v1, v2, v3 = (load(a) for a in sys.argv[1:4])
    out = Path(sys.argv[4]) if len(sys.argv) > 4 else None
    common = sorted(set(v1) & set(v2) & set(v3), key=key)

    def bad(d):  # 원본 승 = 수정이 개악
        return {k for k in common if not d[k]["fix_won"]}

    b1, b2, b3 = bad(v1), bad(v2), bad(v3)
    print(f"세 판정이 모두 있는 쌍 : {len(common)}\n")
    for name, b in (("v1 Gemini 단독", b1),
                    ("v2 이중(92건 sanitize)", b2),
                    ("v3 이중(원래 입력)", b3)):
        print(f"  {name:26} 개악 {len(b):3d} ({100*len(b)/len(common):.1f}%)")

    flip = sorted({k for k in common if v2[k]["fix_won"] != v3[k]["fix_won"]},
                  key=key)
    print(f"\n★ v2↔v3 가 갈린 샷 : {len(flip)} "
          f"({100*len(flip)/len(common):.1f}%)  ← sanitize 된 입력이 흔든 폭")
    if flip:
        print(f"   {', '.join(flip[:30])}" + (" …" if len(flip) > 30 else ""))

    revert = sorted(b1 & b3, key=key)
    only1 = sorted(b1 - b3, key=key)
    only3 = sorted(b3 - b1, key=key)
    keep = len(common) - len(b1 | b3)
    print(f"\n=== 되돌릴 후보 (v1 ∩ v3) ===")
    print(f"  ★둘 다 개악 — 되돌린다      : {len(revert)} "
          f"({100*len(revert)/len(common):.1f}%)")
    print(f"  둘 다 '수정본이 낫다'        : {keep}")
    print(f"  불일치 — 손대지 않는다       : {len(only1) + len(only3)}")
    print(f"    v1 만 개악(Gemini 단독)    : {len(only1)}")
    print(f"    v3 만 개악(이중)           : {len(only3)}")
    print(f"\n  v1↔v3 일치율 : "
          f"{100*(len(revert)+keep)/len(common):.1f}%")
    print(f"\n되돌릴 후보:\n  {', '.join(revert)}")

    if out:
        out.write_text(json.dumps({
            "revert": revert,
            "disagree_v1_only": only1,
            "disagree_v3_only": only3,
            "v2_v3_flipped": flip,
        }, ensure_ascii=False, indent=1), "utf-8")
        print(f"\n기록: {out}")


if __name__ == "__main__":
    main()
