from pathlib import Path
import argparse
import copy
import csv
import hashlib
import io
import json
import re

parser = argparse.ArgumentParser()
parser.add_argument("--actual")
parser.add_argument("--local-http", action="store_true")
args = parser.parse_args()
checks = []
def check(condition, label):
    if not condition:
        raise ValueError(label)
    checks.append(label)
def load(name): return json.loads(Path(name).read_text())
def rows(name): return list(csv.DictReader(io.StringIO(Path(name).read_text(encoding="utf-8-sig"))))
def negative(fn, value, label):
    try: fn(value)
    except (ValueError, AssertionError, KeyError, TypeError, IndexError): checks.append(label)
    else: raise AssertionError("Negative input accepted: " + label)
items=load("items.json");selected=[r["id"] for r in items if r["stock"]]
check(selected==["P01","P03","P05"],"three actual in-stock source IDs")
cache=load("action-reference.json")
def validate(v):
    if v["pageVersion"]!=1 or v["action"]["method"]!="click" or v["action"]["selector"]!="#only-stock-v1":raise ValueError("invalid or stale action cache")
validate(cache);checks.append("manual action contract valid, not model output")
bad=copy.deepcopy(cache);bad["pageVersion"]=2;negative(validate,bad,"changed page version rejects old cache")
bad=copy.deepcopy(cache);bad["action"]["method"]="delete";negative(validate,bad,"unexpected action method rejected")
report={"layer":"offline/material checks, not proof of unrun product or model", "checks":checks, "count":len(checks)}
Path("verification.json").write_text(json.dumps(report,ensure_ascii=False,indent=2))
print(json.dumps(report,ensure_ascii=False))
