#!/usr/bin/env python3
"""Reproduce Citelift's two synthetic teaching examples. Local files only; no API calls.

Place beside the two supplied *-synthetic.csv files and run with Python 3.
This is a fixture verifier, not a crawler, vendor evaluator or production feed audit.
"""
import csv
import json
from decimal import Decimal
from pathlib import Path

ROOT = Path(__file__).resolve().parent


def read_fixture(name):
    with (ROOT / name).open(newline="", encoding="utf-8") as source:
        rows = list(csv.DictReader(source))
    if not rows or any(row.get("synthetic") != "true" for row in rows):
        raise ValueError("Expected the supplied explicitly synthetic fixture")
    return rows


def boolean(value):
    if value not in ("true", "false"):
        raise ValueError("A complete observation needs an explicit boolean")
    return value == "true"


def rate(count, total):
    return round(100 * count / total, 1) if total else None


def visibility_example():
    rows = read_fixture("visibility-observations-synthetic.csv")
    keys = {(row["engine"], row["prompt_id"]) for row in rows}
    if len(keys) != len(rows):
        raise ValueError("Duplicate planned observation")
    complete = [row for row in rows if row["status"] == "complete"]
    for row in rows:
        if row["status"] not in ("complete", "error", "blocked"):
            raise ValueError("Unknown fixture status")
        if row["status"] == "complete":
            if row["freshness"] not in ("fresh", "cached"):
                raise ValueError("Missing observation freshness")
            boolean(row["mentions_brand"])
            boolean(row["owned_domain_link"])
        elif row["mentions_brand"] or row["owned_domain_link"]:
            raise ValueError("Missing answers must not contain measured outcomes")
    fresh = [row for row in complete if row["freshness"] == "fresh"]
    mentions = sum(boolean(row["mentions_brand"]) for row in complete)
    fresh_mentions = sum(boolean(row["mentions_brand"]) for row in fresh)
    fresh_links = sum(boolean(row["owned_domain_link"]) for row in fresh)
    result = {
        "planned": len(rows), "successful_including_cached": len(complete),
        "unavailable": len(rows) - len(complete), "fresh_successful": len(fresh),
        "cached_successful": len(complete) - len(fresh),
        "returned_answer_coverage_pct": rate(len(complete), len(rows)),
        "mentions_including_cached": mentions,
        "mention_rate_including_cached_pct": rate(mentions, len(complete)),
        "fresh_mentions": fresh_mentions,
        "fresh_mention_rate_pct": rate(fresh_mentions, len(fresh)),
        "fresh_owned_link_answers": fresh_links,
        "fresh_owned_link_rate_pct": rate(fresh_links, len(fresh)),
    }
    assert result["planned"] == 8 and result["successful_including_cached"] == 6
    assert result["returned_answer_coverage_pct"] == 75.0
    assert result["mention_rate_including_cached_pct"] == 66.7
    assert result["fresh_mention_rate_pct"] == 50.0
    assert result["fresh_owned_link_rate_pct"] == 25.0
    return result


def variants_example():
    rows = read_fixture("variant-observations-synthetic.csv")
    if len({row["variant_id"] for row in rows}) != len(rows):
        raise ValueError("Duplicate fixture variant")
    findings = []
    for row in rows:
        if row["market"] != "US" or row["purchase_option"] != "one_time":
            raise ValueError("Expected the same-market, one-time fixture")
        issues = []
        for surface in ("markup", "feed"):
            for field in ("price", "currency", "availability"):
                actual, expected = row[f"{surface}_{field}"], row[f"page_{field}"]
                if not actual or not expected:
                    raise ValueError("This complete fixture cannot model missing evidence")
                if field == "price":
                    actual, expected = Decimal(actual), Decimal(expected)
                if actual != expected:
                    issues.append(f"{surface}_{field}")
        if not boolean(row["landing_url_preselects"]):
            issues.append("landing_selection")
        findings.append({"variant_id": row["variant_id"], "issues": issues})
    result = {
        "variants": len(rows),
        "variants_with_conflicts": sum(bool(row["issues"]) for row in findings),
        "conflicting_checks": sum(len(row["issues"]) for row in findings),
        "findings": findings,
    }
    assert result["variants"] == 4
    assert result["variants_with_conflicts"] == 3
    assert result["conflicting_checks"] == 5
    return result


if __name__ == "__main__":
    print(json.dumps({
        "evidence_type": "synthetic teaching examples; not live platform results",
        "visibility": visibility_example(), "variants": variants_example(),
    }, indent=2))
