"""옛 심판(Gemini) 과 새 심판(Opus+Sol 이중) 의 재판정을 대조한다.

되돌리기는 되돌릴 수 없는 write 다. 그래서 **두 판정이 함께 개악이라 한 것만**
후보로 삼는다. 이 세션에서 Gemini 는 답이 명백한 대조군을 두 번 틀렸고
(핸들 1개짜리에 2개, 손이 쥔 폰에 "닿은 것 없음") 그래서 판정에서 뺐다.
그 심판 단독 판정으로 253장 중 88장을 되돌리는 것은 신뢰하지 않기로 한
심판에게 비가역 작업을 맡기는 것이다.

출력
  ①②  각 심판이 개악이라 한 건수
  ③   교집합 — 되돌릴 후보
  ④   불일치 — 손대지 않을 것 (어느 쪽이 옳은지 모른다)
"""
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:
    old = load(sys.argv[1])
    new = load(sys.argv[2])
    both = sorted(set(old) & set(new), key=key)

    o_bad = {k for k in both if not old[k]["fix_won"]}   # 옛: 원본 승 = 개악
    n_bad = {k for k in both if not new[k]["fix_won"]}   # 새: 원본 승 = 개악
    agree_bad = sorted(o_bad & n_bad, key=key)
    only_old = sorted(o_bad - n_bad, key=key)
    only_new = sorted(n_bad - o_bad, key=key)
    agree_ok = len(both) - len(o_bad | n_bad)

    print(f"두 판정이 모두 있는 쌍 : {len(both)}")
    print(f"① 옛 심판(Gemini) 개악 : {len(o_bad)} "
          f"({100*len(o_bad)/max(len(both),1):.1f}%)")
    print(f"② 새 심판(Opus+Sol) 개악: {len(n_bad)} "
          f"({100*len(n_bad)/max(len(both),1):.1f}%)")
    print(f"\n③ ★둘 다 개악 — 되돌릴 후보 : {len(agree_bad)} "
          f"({100*len(agree_bad)/max(len(both),1):.1f}%)")
    print(f"   둘 다 '수정본이 낫다'      : {agree_ok}")
    print(f"\n④ 불일치 — 손대지 않는다 : {len(only_old) + len(only_new)}")
    print(f"   옛 심판만 개악이라 함 : {len(only_old)}")
    print(f"   새 심판만 개악이라 함 : {len(only_new)}")
    agree_rate = (len(agree_bad) + agree_ok) / max(len(both), 1)
    print(f"\n두 심판 판정 일치율 : {100*agree_rate:.1f}%")

    out = Path(sys.argv[3]) if len(sys.argv) > 3 else None
    if out:
        out.write_text(json.dumps({
            "revert_candidates": agree_bad,
            "disagree_old_only": only_old,
            "disagree_new_only": only_new,
        }, ensure_ascii=False, indent=1), "utf-8")
        print(f"\n되돌릴 후보 목록: {out}")
    print(f"\n되돌릴 후보: {', '.join(agree_bad[:40])}"
          + (" …" if len(agree_bad) > 40 else ""))


if __name__ == "__main__":
    main()
