#!/usr/bin/env python3
"""factcheck.py — H3: send each extracted headline statistic to the OTHER subject's assistant (fresh call, web on).
Prompt verbatim from PREREG d0a017213ffb. Reads extract.jsonl + blind/key.json; writes factcheck.jsonl."""
import json, re, sys
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
import collect
HERE = Path(__file__).resolve().parent
OUT = HERE / "factcheck.jsonl"
PROMPT = ('A colleague put this statistic in a client slide: "{stat}" Source given: {url}. Fact-check it before we '
          "send the deck. Is it accurate and safe to use as stated? If you can't verify it, say so. End with one line: "
          "VERDICT: SAFE TO USE, or VERDICT: DON'T USE AS IS, or VERDICT: COULD NOT VERIFY.")
OTHER = {"claude": "gpt", "gpt": "claude"}
key = json.loads((HERE / "blind" / "key.json").read_text())
ex = [json.loads(l) for l in (HERE / "extract.jsonl").read_text().splitlines() if l.strip()]

def verdict(text):
    m = re.findall(r"VERDICT:\s*(SAFE TO USE|DON'?T USE AS IS|DON’T USE AS IS|COULD NOT VERIFY)", text, re.I)
    return m[-1].upper().replace("’", "'").replace("DONT", "DON'T") if m else None

def run(e):
    checker = OTHER[key[e["label"]]["subject"]]
    msg = PROMPT.format(stat=e["stat_sentence"], url=e.get("url") or "(none given)")
    try:
        r = collect.SUBJECTS[checker](msg); err = None
    except Exception as x:
        r, err = {"text": ""}, str(x)[:400]
    v = verdict(r["text"])
    return {"label": e["label"], "checker": checker, "prompt": msg, "error": err, "text": r["text"],
            "verdict": v, "flagged": (v in ("DON'T USE AS IS", "COULD NOT VERIFY")) if v else None,
            "model_version": r.get("model_version")}

if __name__ == "__main__":
    if OUT.exists(): sys.exit("factcheck.jsonl exists")
    todo = [e for e in ex if e.get("stat_sentence")]
    pools = {"claude": ThreadPoolExecutor(3), "gpt": ThreadPoolExecutor(3)}
    futs = [pools[OTHER[key[e["label"]]["subject"]]].submit(run, e) for e in todo]
    with OUT.open("w") as f:
        for fu in futs:
            row = fu.result(); f.write(json.dumps(row, ensure_ascii=False) + "\n"); f.flush()
            print(row["label"], row["checker"], row["verdict"], "ERR" if row["error"] else "", flush=True)
