#!/usr/bin/env python3
"""Validate the strategic 10-loop CRWV research package."""

from __future__ import annotations

import csv
import subprocess
import sys
from pathlib import Path


BASE = Path(__file__).resolve().parent
PUBLIC = BASE.parent / "public" / "index.html"
REQUIRED = [
    "crwv_source_inventory.csv",
    "crwv_source_fetch_log.csv",
    "crwv_core_evidence_rows.csv",
    "crwv_backlog_conversion.csv",
    "crwv_signal_scores.csv",
    "crwv_vs_apld_comparison.csv",
    "crwv_decision_backlog.csv",
    "crwv_one_page_memo.md",
    "strategic10_loop_summary.csv",
    "strategic_crwv_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_crwv.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}")

    inventory = rows("crwv_source_inventory.csv")
    require(len(inventory) >= 8, "expected at least eight source inventory rows")
    require(all(r["source_url"].startswith("https://") for r in inventory), "source URL missing https")

    evidence = rows("crwv_core_evidence_rows.csv")
    require(len(evidence) >= 25, "expected at least 25 evidence rows")
    metrics = {r["metric"] for r in evidence}
    for metric in [
        "revenue",
        "revenue_backlog",
        "active_power",
        "contracted_power",
        "capital_expenditures",
    ]:
        require(metric in metrics, f"missing metric: {metric}")
    periods = {r["period"] for r in evidence}
    require({"Q1 2025", "Q2 2025", "Q3 2025", "Q4 2025", "Q1 2026"} <= periods, "missing required quarters")
    require(all(r["source_snippet"].strip() for r in evidence), "evidence row missing snippet")
    require(all(float(r["value"]) > 0 for r in evidence), "non-positive evidence value")

    conversion = rows("crwv_backlog_conversion.csv")
    require(len(conversion) == 3, "expected three conversion checkpoints")
    require(any(float(r["backlog_to_quarterly_revenue_x"]) > 40 for r in conversion), "missing high backlog conversion burden")

    scores = rows("crwv_signal_scores.csv")
    require(len(scores) >= 6, "expected six signal scores")
    overall = [r for r in scores if r["signal_dimension"] == "overall_signal_quality"]
    require(overall and int(overall[0]["score_1_10"]) >= 8, "overall signal score too weak")
    for row in scores:
        score = int(row["score_1_10"])
        require(1 <= score <= 10, "signal score out of range")

    comparison = rows("crwv_vs_apld_comparison.csv")
    joined = " ".join(r["ticker"] for r in comparison)
    require("APLD" in joined and "CRWV" in joined, "comparison missing APLD or CRWV")

    backlog = rows("crwv_decision_backlog.csv")
    require(len(backlog) >= 5, "decision backlog too thin")
    require(any("Oracle" in r["next_work"] for r in backlog), "decision backlog missing Oracle")
    require(any("Equinix" in r["next_work"] for r in backlog), "decision backlog missing Equinix")

    memo = (BASE / "crwv_one_page_memo.md").read_text(encoding="utf-8")
    for phrase in ["Original Question", "Watch Items", "What Would Change", "CRWV", "APLD"]:
        require(phrase in memo, f"memo missing {phrase}")

    summary = rows("strategic10_loop_summary.csv")
    require(len(summary) == 10, "expected ten loop summaries")
    for row in summary:
        score = int(row["score_1_10"])
        require(1 <= score <= 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")

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

    print("strategic10 CRWV validation passed")


if __name__ == "__main__":
    main()
