import json, re, sys

BEFORE = "/tmp/claude-0/-home-danvics-docker-quiz/c1e0577a-e42c-4a3d-b1ea-3edd61103a4e/scratchpad/mdm/mdm-02.json"
AFTER = "/tmp/claude-0/-home-danvics-docker-quiz/c1e0577a-e42c-4a3d-b1ea-3edd61103a4e/scratchpad/mdm/mdm-02.done.json"

ALLOWED_TITLES = ["Clinical paths", "Diagnosis", "Management", "Prognosis and outcome"]

before = {a["article_id"]: a for a in json.load(open(BEFORE))}
after = {a["article_id"]: a for a in json.load(open(AFTER))}

def all_text(sections):
    return "\n".join(s["content"] for s in sections)

def markers(text):
    return sorted(re.findall(r"\[\[(\d+)\|", text))

def numbers(text):
    return sorted(re.findall(r"\d+(?:\.\d+)?", text))

fail_count = 0
prognosis_count = 0

if set(before.keys()) != set(after.keys()):
    print("ARTICLE ID SET MISMATCH", set(before.keys()) ^ set(after.keys()))
    fail_count += 1

for aid in before:
    b = before[aid]
    a = after.get(aid)
    if a is None:
        print(aid, "MISSING in after")
        fail_count += 1
        continue
    if a["article_title"] != b["article_title"]:
        print(aid, "TITLE MISMATCH")
        fail_count += 1

    btext = all_text(b["sections"])
    atext = all_text(a["sections"])

    bm = markers(btext)
    am = markers(atext)
    if bm != am:
        print(aid, b["article_title"], "MARKER MISMATCH")
        print("  before:", bm)
        print("  after :", am)
        fail_count += 1

    bn = numbers(btext)
    an = numbers(atext)
    if bn != an:
        print(aid, b["article_title"], "NUMBER MISMATCH")
        # show diff
        from collections import Counter
        cb, ca = Counter(bn), Counter(an)
        missing = cb - ca
        extra = ca - cb
        if missing:
            print("  missing from after:", dict(missing))
        if extra:
            print("  extra in after:", dict(extra))
        fail_count += 1

    ratio = len(atext) / len(btext) if len(btext) else 1
    if not (0.8 <= ratio <= 1.3):
        print(aid, b["article_title"], f"LENGTH RATIO {ratio:.3f} (before={len(btext)} after={len(atext)})")
        fail_count += 1

    titles = [s["title"] for s in a["sections"]]
    if any(t not in ALLOWED_TITLES for t in titles):
        print(aid, b["article_title"], "INVALID TITLE(S)", titles)
        fail_count += 1
    if len(set(titles)) != len(titles):
        print(aid, b["article_title"], "REPEATED TITLE", titles)
        fail_count += 1
    core = [t for t in titles if t != "Prognosis and outcome"]
    if core != ["Clinical paths", "Diagnosis", "Management"]:
        print(aid, b["article_title"], "CORE ORDER/PRESENCE WRONG", titles)
        fail_count += 1
    if titles != sorted(titles, key=lambda t: ALLOWED_TITLES.index(t)):
        print(aid, b["article_title"], "ORDER WRONG", titles)
        fail_count += 1
    if "Prognosis and outcome" in titles:
        prognosis_count += 1

print()
print("=== SUMMARY ===")
print("Articles checked:", len(before))
print("Articles with Prognosis and outcome:", prognosis_count)
print("Total failures:", fail_count)
