#!/usr/bin/env python3
"""Offline invariant checks for the WLDW static architecture package."""
from __future__ import annotations
import csv
from pathlib import Path

ROOT = Path(__file__).resolve().parent
PROFILES = ROOT / "synthetic-profiles-WLDW-20260831.csv"
ASSUMPTIONS = ROOT / "assumption-register-WLDW-20260831.csv"
EXPECTED = {
    "one_off_sanctioned_columnar_extract": "evaluate_governed_file_workflow",
    "recurring_shared_governed_analytics": "evaluate_warehouse_lakehouse_query_service",
    "recurring_stateful_operational_pipeline": "evaluate_pipeline_distributed_processing",
}
CRITERIA = {"recurrence_cadence","consumers_concurrency","source_of_record","ingestion_update","transactional_consistency","semantic_governance","query_workload_isolation","security_residency","lineage_retention","observability_recovery_slo","data_movement","cost_model","team_capability"}
FORBIDDEN_FIELDS = {"rows","row_count","bytes","byte_volume","runtime","elapsed_time","duration","cost","price","customer","customer_id","product","product_id","vendor_winner","winner","benchmark_result"}
FORBIDDEN_CLAIMS = ("validated winner","warehouse wins","file wins","pipeline wins","customer result","production benchmark")
SOURCE_MARKERS = (
    "Retrieved: 2026-08-31",
    "https://www.nist.gov/publications/nist-cloud-computing-reference-architecture",
    "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.1500-6r1.pdf",
    "https://cloud.google.com/bigquery/docs/introduction",
    "https://docs.cloud.google.com/bigquery/docs/query-plan-explanation",
    "https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs",
    "https://docs.snowflake.com/en/user-guide/intro-key-concepts",
    "https://docs.snowflake.com/en/sql-reference/account-usage/query_history",
    "https://docs.aws.amazon.com/redshift/latest/dg/c_high_level_system_architecture.html",
    "https://docs.aws.amazon.com/redshift/latest/dg/r_STL_QUERY.html",
    "https://parquet.apache.org/docs/overview/",
    "https://iceberg.apache.org/spec/",
    "https://duckdb.org/docs/stable/data/parquet/overview",
)

def read_csv(path):
    with path.open(newline="", encoding="utf-8") as handle:
        reader = csv.DictReader(handle)
        return list(reader.fieldnames or []), list(reader)

def require(condition, message):
    if not condition:
        raise AssertionError(message)

def main():
    fields, profiles = read_csv(PROFILES)
    assumption_fields, assumptions = read_csv(ASSUMPTIONS)
    require(len(profiles) == 3, "profiles CSV must contain exactly three rows")
    require({r["profile_id"]: r["provisional_recommendation"] for r in profiles} == EXPECTED, "recommendation mapping differs from allowed record")
    require(all(r["validation_status"] == "not_validated" for r in profiles), "validation_status must be not_validated")
    require(all(r["decision_status"] == "provisional" for r in profiles), "decision_status must be provisional")
    require(len(assumptions) == 13 and {r["criterion_id"] for r in assumptions} == CRITERIA, "assumption register must contain exactly thirteen required criteria")
    require("criterion_id" in assumption_fields, "criterion_id missing")
    lowered_fields = {f.lower() for f in fields + assumption_fields}
    require(not lowered_fields.intersection(FORBIDDEN_FIELDS), "forbidden measured/customer/product/winner field present")
    qualitative = {"one_off","recurring","recurring_event_or_schedule","named_reviewers","multiple_consumer_classes","machine_and_operator_consumers","identified_not_tested","static_extract","incremental_to_be_determined","stateful_updates","to_be_determined","required_not_tested","shared_definitions_required","output_contract_required","recovery_required_not_tested","bounded_not_measured"}
    for row in profiles:
        for key, value in row.items():
            if key not in {"profile_id","profile_description","provisional_recommendation","validation_status","decision_status"}:
                require(value in qualitative, f"non-qualitative value in {key}: {value}")
    package = "\n".join(p.read_text(encoding="utf-8").lower() for p in ROOT.iterdir() if p.is_file() and p.suffix in {".csv",".md"})
    require(not any(claim in package for claim in FORBIDDEN_CLAIMS), "forbidden winner/customer/benchmark claim present")
    source_text = (ROOT / "external-source-check-WLDW-20260831.md").read_text(encoding="utf-8")
    require(all(marker in source_text for marker in SOURCE_MARKERS), "source retrieval marker or required direct URL missing")
    print("PASS: exactly 3 synthetic profiles")
    print("PASS: exactly 13 required criteria")
    print("PASS: allowed recommendations only")
    print("PASS: validation_status=not_validated and decision_status=provisional")
    print("PASS: qualitative profile values only")
    print("PASS: no measured rows/bytes/runtime/cost, customer/product, benchmark, or winner fields/claims")
    print("PASS: retrieval date and 12 direct source URLs present")

if __name__ == "__main__":
    main()
