#!/usr/bin/env python3
"""
validate_facet_registry.py

Loads facet_registry.json and checks:
  - exactly 33 facets
  - verdict tallies: 19 PASS, 13 NEUTRAL, 1 FAIL
  - each facet has non-empty vs_baseline and dct_contrast (discriminator vs ΛCDM / GR / SM)
  - each primary_scripts path exists under site/files/code/
  - each non-null observable_slug has site/observables/<slug>/index.html

Run from anywhere:
  python3 validate_facet_registry.py
"""

from __future__ import annotations

import json
import sys
from collections import Counter
from pathlib import Path

_SCRIPT = Path(__file__).resolve()
_EMPIRICAL = _SCRIPT.parent
_CODE_ROOT = _EMPIRICAL.parent  # site/files/code
_SITE_ROOT = _CODE_ROOT.parents[1]  # site/


def main() -> int:
    reg_path = _EMPIRICAL / "facet_registry.json"
    data = json.loads(reg_path.read_text(encoding="utf-8"))
    facets = data["facets"]
    n = len(facets)
    if n != 33:
        print(f"ERROR: expected 33 facets, got {n}", file=sys.stderr)
        return 1

    counts = Counter(f["verdict"] for f in facets)
    expected = {"PASS": 19, "NEUTRAL": 13, "FAIL": 1}
    for k, v in expected.items():
        if counts.get(k) != v:
            print(f"ERROR: verdict {k}: expected {v}, got {counts.get(k, 0)}", file=sys.stderr)
            return 1
    extras = set(counts) - set(expected)
    if extras:
        print(f"ERROR: unexpected verdict keys: {extras}", file=sys.stderr)
        return 1

    ids = [f["id"] for f in facets]
    if len(set(ids)) != len(ids):
        print("ERROR: duplicate facet id", file=sys.stderr)
        return 1

    for f in facets:
        for key in ("vs_baseline", "dct_contrast"):
            val = f.get(key)
            if not val or not str(val).strip():
                print(f"ERROR: facet {f['id']!r} missing or empty {key!r}", file=sys.stderr)
                return 1
        for rel in f.get("primary_scripts") or []:
            p = _CODE_ROOT / rel
            if not p.is_file():
                print(f"ERROR: missing script {rel} (facet {f['id']})", file=sys.stderr)
                return 1
        slug = f.get("observable_slug")
        if slug:
            obs = _SITE_ROOT / "observables" / slug / "index.html"
            if not obs.is_file():
                print(f"ERROR: missing observable page for slug {slug!r} (facet {f['id']})", file=sys.stderr)
                return 1

    print("facet_registry.json: OK (33 rows, 19/13/1, scripts and observables present)")
    return 0


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