"""Check a flat, string-valued JSON array against a CSV export."""
import csv
import json
from pathlib import Path

source = json.loads(Path("audit-json-to-csv-source.json").read_text(encoding="utf-8"))
if not isinstance(source, list) or not all(isinstance(r, dict) for r in source):
    raise ValueError("Expected a JSON array of objects")
if not all(isinstance(v, str) for r in source for v in r.values()):
    raise ValueError("This exact-value example expects string fields")

expected_columns = list(dict.fromkeys(k for r in source for k in r))
with open("audit-json-to-csv-export.csv", newline="", encoding="utf-8-sig") as stream:
    records = list(csv.reader(stream))
if not records:
    raise ValueError("CSV is empty")
header, rows = records[0], records[1:]
if header != expected_columns or len(header) != len(set(header)):
    raise ValueError(f"Header mismatch: expected {expected_columns}, got {header}")
if len(rows) != len(source):
    raise ValueError(f"Row mismatch: expected {len(source)}, got {len(rows)}")
for number, (original, cells) in enumerate(zip(source, rows), start=2):
    if len(cells) != len(header):
        raise ValueError(f"CSV record {number}: expected {len(header)} cells, got {len(cells)}")
    for column, actual in zip(header, cells):
        expected = original.get(column, "")
        if actual != expected:
            raise ValueError(f"CSV record {number}, {column}: {actual!r} != {expected!r}")
print(f"PASS: {len(rows)} data rows, {len(header)} columns, every string cell matched")
