# -*- coding: utf-8 -*-
import json, re, sys
sys.path.insert(0, '.')
import build

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

with open('mdm-04.json') as f:
    data = json.load(f)

out = []
errors = []

for art in data:
    aid = art['article_id']
    before_text = "\n".join(s['content'] for s in art['sections'])
    if aid not in build.ARTICLES:
        errors.append((aid, art['article_title'], "MISSING from build.ARTICLES"))
        out.append(art)
        continue
    new_sections_list = build.ARTICLES[aid]
    new_sections = [{"title": t, "content": c} for (t, c) in new_sections_list]
    after_text = "\n".join(s['content'] for s in new_sections)

    # checks
    titles = [t for (t, c) in new_sections_list]
    if len(titles) < 3 or len(titles) > 4:
        errors.append((aid, art['article_title'], f"section count {len(titles)}"))
    if len(set(titles)) != len(titles):
        errors.append((aid, art['article_title'], f"duplicate titles {titles}"))
    for t in titles:
        if t not in ALLOWED_TITLES:
            errors.append((aid, art['article_title'], f"bad title {t}"))
    expected_order = [t for t in ALLOWED_TITLES if t in titles]
    if titles != expected_order:
        errors.append((aid, art['article_title'], f"bad order {titles}"))
    if "Clinical paths" not in titles or "Diagnosis" not in titles or "Management" not in titles:
        errors.append((aid, art['article_title'], f"missing required section: {titles}"))

    before_refs = sorted(re.findall(r"\[\[(\d+)\|", before_text))
    after_refs = sorted(re.findall(r"\[\[(\d+)\|", after_text))
    if before_refs != after_refs:
        errors.append((aid, art['article_title'], f"REF MISMATCH before={before_refs} after={after_refs}"))

    before_nums = sorted(re.findall(r"\d+(?:\.\d+)?", before_text))
    after_nums = sorted(re.findall(r"\d+(?:\.\d+)?", after_text))
    if before_nums != after_nums:
        # compute diff
        from collections import Counter
        cb, ca = Counter(before_nums), Counter(after_nums)
        missing = cb - ca
        extra = ca - cb
        errors.append((aid, art['article_title'], f"NUM MISMATCH missing={dict(missing)} extra={dict(extra)}"))

    ratio = len(after_text) / len(before_text) if before_text else 1.0
    if not (0.8 <= ratio <= 1.3):
        errors.append((aid, art['article_title'], f"LENGTH ratio={ratio:.3f} before={len(before_text)} after={len(after_text)}"))

    out.append({
        "article_id": aid,
        "article_title": art['article_title'],
        "sections": new_sections,
    })

with open('mdm-04.done.json', 'w') as f:
    json.dump(out, f, ensure_ascii=False, indent=2)

print(f"Total articles: {len(data)}")
print(f"Errors: {len(errors)}")
for e in errors:
    print(e)

prog_count = sum(1 for aid, secs in build.ARTICLES.items() if any(t == "Prognosis and outcome" for t, c in secs))
print(f"Articles with Prognosis and outcome: {prog_count}")
