"""Run the public synthetic corpus against the API, sequentially (40 requests).

python evaluate_live.py --dataset baseline-v1.json --output live-results.json
Uses the anonymous allowance. Stops on quota/refusal; never creates accounts.
Optional TRISMAG_API_KEY uses the caller's own allowance. Never prints the key.
"""
import argparse
import hashlib
import json
import os
import time
import urllib.error
import urllib.request
from pathlib import Path

BASE = "https://trismag-api.fly.dev"


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--dataset", type=Path, required=True)
    parser.add_argument("--output", type=Path, default=Path("live-results.json"))
    args = parser.parse_args()
    raw = args.dataset.read_bytes()
    dataset = json.loads(raw)
    with urllib.request.urlopen(BASE + "/health", timeout=20) as response:
        health = json.load(response)
    rows = []
    for case in dataset["cases"]:
        payload = case["payload"]
        endpoint = "/v1/triage"
        if case["mode"] == "tools":
            payload = {"tools": [payload["tool"]]}
            endpoint = "/v1/tools"
        headers = {"Content-Type": "application/json"}
        if os.environ.get("TRISMAG_API_KEY"):
            headers["Authorization"] = "Bearer " + os.environ["TRISMAG_API_KEY"]
        request = urllib.request.Request(BASE + endpoint, headers=headers,
            data=json.dumps(payload, ensure_ascii=False).encode("utf-8"))
        start = time.perf_counter()
        try:
            try:
                response = urllib.request.urlopen(request, timeout=20)
            except urllib.error.HTTPError as error:
                response = error
            with response:
                body = json.load(response)
                status = response.status
            complete = (status == 200 and body.get("scan_complete") is not False
                        and body.get("risk") in ("LOW", "MEDIUM", "HIGH", "CRITICAL"))
            rows.append({"id": case["id"], "label": case["label"], "status": status,
                         "risk": body.get("risk") if complete else None,
                         "complete": complete, "round_trip_ms": round((time.perf_counter()-start)*1000, 2)})
            if not complete:
                break
        except (OSError, ValueError):
            rows.append({"id": case["id"], "complete": False, "risk": None, "error": "network or response failure"})
            break
    report = {"api_version": health["version"], "dataset_sha256": hashlib.sha256(raw).hexdigest(),
              "provenance": "Live execution of the supplied corpus against the reported API version. This does not establish independence, held-out status or real-world accuracy.",
              "dataset_provenance": dataset["provenance"], "requested_cases": len(dataset["cases"]),
              "completed_cases": sum(r["complete"] for r in rows),
              "timing_note": "Sequential round trips from one client; not a load test or service-level guarantee.",
              "results": rows}
    args.output.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({k: report[k] for k in ("api_version", "requested_cases", "completed_cases")}))
    return 0 if report["completed_cases"] == report["requested_cases"] else 1


if __name__ == "__main__":
    raise SystemExit(main())
