"""Shared machinery for the document-style leadership pages.
Pure ASCII in and out. References record their own usage for the ledger's back-links."""
import html
import json
from pathlib import Path

SITE = Path(__file__).resolve().parent.parent / "site-v2"
if not SITE.exists():
    SITE = Path(__file__).resolve().parent.parent / "site"

DATA = json.load(open(SITE / "assets" / "claims.json"))
CLAIMS = {c["id"]: c for c in DATA["claims"]}
S = DATA["summary"]

USAGE = {}
CURRENT = {"page": None, "anchor": None, "label": None}

GRADE_WORD = {
    "A": "grade A: holds regardless of model progress",
    "B": "grade B: current-generation measurement, confirmed at the bakeoff",
    "C": "grade C: superseded-generation number, mechanism only",
}


def esc(s):
    return html.escape(s, quote=True)


def at(page, anchor, label):
    CURRENT.update(page=page, anchor=anchor, label=label)


def _record(cid):
    entry = {"page": CURRENT["page"], "anchor": CURRENT["anchor"], "label": CURRENT["label"]}
    bucket = USAGE.setdefault(cid, [])
    if not any(e["page"] == entry["page"] and e["anchor"] == entry["anchor"] for e in bucket):
        bucket.append(entry)


def R(cid):
    """Bracketed reference to a ledger entry. Records usage."""
    c = CLAIMS.get(cid)
    if c is None:
        return ""
    _record(cid)
    du = c.get("decision_use") or {}
    tip = esc(GRADE_WORD.get(du.get("grade", ""), "") + ". " + c["claim"][:180])
    return '<a class="ref" href="evidence.html#%s" title="%s">[%s]</a>' % (cid, tip, cid)


def RG(cid, note):
    """Evidence row for the decision pages: ref, grade in words, one-line reason."""
    c = CLAIMS.get(cid)
    if c is None:
        return ""
    _record(cid)
    du = c.get("decision_use") or {}
    g = du.get("grade", "?")
    basis = du.get("basis", "")
    return ('<span class="evrow">%s (%s - %s) %s</span>'
            % (R(cid), esc("grade " + g), esc(basis), esc(note)))


def G(gid, label=None):
    tip = "Measured gap: the reviewed corpus identifies no evidence; scheduled for in-house measurement."
    return '<a class="ref" href="evidence.html#%s" title="%s">[%s]</a>' % (gid, tip, label or gid.upper())


NAV = [
    ("index.html", "home", "Overview"),
    ("brief.html", "summary", "Summary"),
    ("research.html", "research", "Research"),
    ("architecture.html", "architecture", "System"),
    ("pilot.html", "pilot", "Pilot"),
    ("decisions.html", "decisions", "Decisions"),
    ("evidence.html", "evidence", "Evidence"),
    ("library.html", "library", "Library"),
]


def shell(title, description, active, body):
    nav = "\n      ".join(
        '<a href="%s" data-nav="%s">%s</a>' % (href, key, label) for href, key, label in NAV
    )
    return """<!doctype html>
<html lang="en" data-theme="light">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="%s">
  <meta name="theme-color" content="#13243a">
  <title>%s - AutoQA</title>
  <link rel="stylesheet" href="assets/site.css">
  <link rel="stylesheet" href="assets/doc.css">
  <script defer src="assets/site.js"></script>
</head>
<body class="doc-mode">
<a class="skip-link" href="#main">Skip to content</a>
<header class="site-header">
  <div class="header-inner">
    <a class="brand" href="index.html">AutoQA</a>
    <button class="nav-toggle" type="button" aria-expanded="false" aria-controls="primary-nav">Menu</button>
    <nav id="primary-nav" class="primary-nav" aria-label="Primary navigation">
      %s
    </nav>
    <div class="header-actions">
      <button class="theme-toggle" type="button" aria-label="Toggle dark mode">Mode</button>
    </div>
  </div>
</header>
<main id="main" class="doc-wrap">
%s
</main><script>document.documentElement.dataset.activeNav="%s";</script>
<footer class="doc-footer">
  <p>AutoQA Foundation 0.1.0. Working record generated 2026-07-15. Every factual claim on these pages links to the
  <a href="evidence.html">evidence ledger</a>; the reasoning they rest on is in <a href="KERNEL.md">the kernel</a>;
  the full research corpus and contract package are in the <a href="library.html">library</a>.</p>
</footer>
</body>
</html>""" % (esc(description), esc(title), nav, body, active)


def write_page(name, title, description, active, body):
    page = shell(title, description, active, body)
    bad = sorted({ch for ch in page if ord(ch) > 127})
    if bad:
        raise ValueError("non-ASCII in %s: %r" % (name, bad))
    (SITE / name).write_text(page, encoding="utf-8")
    print("%s: %d bytes" % (name, len(page)))


def flush_usage():
    out = Path(__file__).resolve().parent / "site_usage.json"
    out.write_text(json.dumps(USAGE, indent=2, ensure_ascii=True), encoding="utf-8")
    print("site_usage.json: %d referenced claims" % len(USAGE))
