#!/usr/bin/env python3
"""Validate the strategic 10-loop Oracle package using the hardened gates."""

from __future__ import annotations

import csv
import subprocess
import sys
from pathlib import Path

sys.path.insert(0, "/home/dev")

from research_loop.validate import production_gate_failures


BASE = Path(__file__).resolve().parent
RUN = BASE.parent
PUBLIC = RUN / "public" / "index.html"
SERVED = Path("/home/dev/public/research-loop/strategic10-orcl-001/index.html")
REQUIRED = [
    "orcl_source_inventory.csv",
    "orcl_source_fetch_log.csv",
    "orcl_core_evidence_rows.csv",
    "orcl_diagnostics.csv",
    "orcl_signal_scores.csv",
    "orcl_vs_apld_crwv_comparison.csv",
    "orcl_decision_backlog.csv",
    "orcl_one_page_memo.md",
    "strategic10_loop_summary.csv",
    "strategic_orcl_dashboard.html",
]


def rows(name: str) -> list[dict[str, str]]:
    with (BASE / name).open(newline="", encoding="utf-8") as f:
        return list(csv.DictReader(f))


def require(condition: bool, message: str) -> None:
    if not condition:
        raise SystemExit(message)


def main() -> None:
    subprocess.run([sys.executable, "build_strategic10_orcl.py"], cwd=BASE, check=True)
    for name in REQUIRED:
        path = BASE / name
        require(path.exists() and path.stat().st_size > 0, f"missing or empty artifact: {name}")

    gate = production_gate_failures(RUN, {"run_type": "company_deep_dive", "expected_artifacts": REQUIRED})
    require(not gate, "production gate failures: " + "; ".join(gate))

    evidence = rows("orcl_core_evidence_rows.csv")
    metrics = {r["metric"] for r in evidence}
    for metric in [
        "remaining_performance_obligations",
        "oci_iaas_revenue",
        "capital_expenditures_ytd",
        "additional_lease_commitments",
        "capex_guidance",
    ]:
        require(metric in metrics, f"missing metric: {metric}")
    require(any(float(r["value"]) >= 553 for r in evidence if r["metric"] == "remaining_performance_obligations"), "missing Q3 RPO value")
    require(any(float(r["value"]) == 248 for r in evidence if r["metric"] == "additional_lease_commitments"), "missing Q2 lease commitment value")

    summary = rows("strategic10_loop_summary.csv")
    require(len(summary) == 10, "expected ten loop rows")
    for row in summary:
        require(1 <= int(row["score_1_10"]) <= 10, "loop score out of range")
        for field in ["chose_20_words", "did_20_words", "score_reason_20_words", "next_20_words"]:
            require(len(row[field].split()) <= 20, f"{field} exceeds 20 words")

    memo = (BASE / "orcl_one_page_memo.md").read_text(encoding="utf-8")
    for phrase in ["Remaining Gaps", "What Would Change", "Oracle", "APLD", "CRWV"]:
        require(phrase in memo, f"memo missing {phrase}")

    require(PUBLIC.exists() and PUBLIC.stat().st_size > 0, "local public index missing")
    require(SERVED.exists() and SERVED.stat().st_size > 0, "served public index missing")
    page = SERVED.read_text(encoding="utf-8")
    for phrase in ["ORCL Strategic 10-Loop Research", "Core Evidence Ledger", "Signal Scores"]:
        require(phrase in page, f"served page missing {phrase}")

    print("strategic10 ORCL validation passed")


if __name__ == "__main__":
    main()
