#!/usr/bin/env python3
"""
Admin Policy Engine · example runner.
Loads the 5 Phase 1 model files + policy_examples.json and runs every vector
through policy_engine.py. Exits 0 on full parity, 1 otherwise.

Run:
    python3 docs/runtime/admin-control-plane-service/verify_examples.py
"""
from __future__ import annotations
import json
import os
import sys

HERE = os.path.dirname(os.path.abspath(__file__))
ADMIN_DIR = os.path.abspath(os.path.join(HERE, "..", "admin-control-plane"))
sys.path.insert(0, HERE)

from policy_engine import (  # noqa: E402
    access_check, mask_resolve, assist_validate, viewas_validate, sensitive_check,
)


def _load(path):
    with open(path, encoding="utf-8") as f:
        return json.load(f)


def main() -> int:
    models = {
        "role_registry":        _load(os.path.join(ADMIN_DIR, "role_registry.json")),
        "access_policy":        _load(os.path.join(ADMIN_DIR, "access_policy.json")),
        "assist_model":         _load(os.path.join(ADMIN_DIR, "assist_model.json")),
        "approval_queue_model": _load(os.path.join(ADMIN_DIR, "approval_queue_model.json")),
        "audit_event_model":    _load(os.path.join(ADMIN_DIR, "audit_event_model.json")),
    }
    ex = _load(os.path.join(HERE, "policy_examples.json"))

    default_now = ex.get("time_base_iso") or "2026-04-19T06:00:00Z"

    def run(fn, ctx, expected):
        if "now_iso" not in ctx:
            ctx = {**ctx, "now_iso": default_now}
        result = fn(models, ctx)
        ok = True
        mismatches = []
        for k, v in expected.items():
            got = result.get(k)
            if got != v:
                ok = False
                mismatches.append(f"{k}: expected={v!r} got={got!r}")
        return ok, result, mismatches

    passes = 0
    fails = 0
    failures = []

    sections = [
        ("access_check",    access_check),
        ("mask_resolve",    mask_resolve),
        ("assist_validate", assist_validate),
        ("viewas_validate", viewas_validate),
        ("sensitive_check", sensitive_check),
    ]
    for key, fn in sections:
        print(f"\n=== {key} ===")
        for e in ex.get(key, []):
            ok, result, mismatches = run(fn, e["ctx"], e["expected"])
            mark = "✅" if ok else "❌"
            print(f"{mark} {e['id']} · {e['name']}")
            if ok:
                passes += 1
            else:
                fails += 1
                failures.append(f"{e['id']}: {'; '.join(mismatches)}")

    print()
    print(f"{passes} pass · {fails} fail")
    if failures:
        print("\nFailures:")
        for f in failures:
            print(" ", f)
    return 0 if fails == 0 else 1


if __name__ == "__main__":
    sys.exit(main())
