from __future__ import annotations

import argparse
import hashlib
import json
from pathlib import Path
from typing import Any


ROOT = Path(__file__).resolve().parents[1]
DEFAULT_OUT = ROOT / "Temp" / "decision_replay_snapshot_pack_v1.json"


def _hash_text(text: str) -> str:
    return hashlib.sha256(text.encode("utf-8")).hexdigest()


def _load(path: Path) -> dict[str, Any]:
    if not path.exists():
        return {}
    try:
        obj = json.loads(path.read_text(encoding="utf-8"))
    except Exception:
        return {}
    return obj if isinstance(obj, dict) else {}


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--out", default=str(DEFAULT_OUT))
    args = ap.parse_args()

    fed_path = ROOT / "Temp" / "final_execution_decision_v2.json"
    truth_path = ROOT / "Temp" / "operational_truth_score_v1.json"
    report_path = ROOT / "Temp" / "operational_report.json"
    fed = _load(fed_path)
    truth = _load(truth_path)
    report = _load(report_path)

    payload = {
        "formula_id": "DECISION_REPLAY_SNAPSHOT_PACK_V1",
        "input_hash": fed.get("source_provenance", {}).get("input_hash") if isinstance(fed.get("source_provenance"), dict) else None,
        "formula_hash": _hash_text(json.dumps(truth, sort_keys=True, ensure_ascii=False)),
        "output_hash": _hash_text(json.dumps(fed, sort_keys=True, ensure_ascii=False)),
        "decision_rows": {
            "global_execution_gate": fed.get("global_execution_gate"),
            "hts_order_count": fed.get("hts_order_count"),
            "report_section_count": report.get("section_count"),
            "truth_score_0_100": truth.get("score_0_100"),
        },
    }

    out_path = Path(args.out)
    if not out_path.is_absolute():
        out_path = ROOT / out_path
    out_path.parent.mkdir(parents=True, exist_ok=True)
    out_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(payload, ensure_ascii=False, indent=2))
    return 0


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