from pathlib import Path
import argparse,json,sys,hashlib
from event_fixture import run_probe
ROOT=Path(__file__).resolve().parents[1]; STATUS=ROOT/'evidence/validation-status.json'
def write_status(o): STATUS.write_text(json.dumps(o,indent=2)+'\n')
def h(p): return hashlib.sha256(p.read_bytes()).hexdigest()
p=argparse.ArgumentParser(); p.add_argument('--confirm-local',action='store_true'); args=p.parse_args()
if not args.confirm_local:
    write_status({'status':'NOT_RUN_CONFIRMATION_REQUIRED','runner_executed':False,'runtime_observations_claimed':False,'final_reliability_decision_claimed':False}); sys.exit(2)
sub=ROOT/'submission/decision.json'
if not sub.exists():
    write_status({'status':'NOT_RUN_INCOMPLETE_SUBMISSION','runner_executed':False,'runtime_observations_claimed':False,'final_reliability_decision_claimed':False}); sys.exit(2)
d=json.loads(sub.read_text()); cases=json.loads((ROOT/'fixture/probe-cases.json').read_text())['cases']; tool=json.loads((ROOT/'toolchain-policy.json').read_text())
expected=tool['expected_case_ids']; required=['receipt_key_rule','atomicity_rule','ordering_rule','bounded_decision','residual_risk','transfer_decision']
if [c['id'] for c in cases] != expected or d.get('status')=='LEARNER_INCOMPLETE' or any(not d.get(k) for k in required) or list(d.get('predictions',{}).keys()) != expected or any(d['predictions'].get(k) is None for k in expected):
    write_status({'status':'NOT_RUN_INCOMPLETE_SUBMISSION','runner_executed':False,'runtime_observations_claimed':False,'final_reliability_decision_claimed':False}); sys.exit(2)
obs=[run_probe(cid) for cid in expected]
rels={'baseline_state_sha256':'fixture/baseline-state.json','probe_cases_sha256':'fixture/probe-cases.json','golden_policy_sha256':'fixture/golden-policy.json','requirements_sha256':'requirements.json','toolchain_policy_sha256':'toolchain-policy.json','event_fixture_sha256':'src/event_fixture.py','static_preflight_sha256':'src/static_preflight.py','learner_decision_sha256':'submission/decision.json'}
prov={k:h(ROOT/v) for k,v in rels.items()}
if list(prov.keys()) != tool['runtime_input_hashes_required']:
    write_status({'status':'NOT_RUN_PROVENANCE_CONTRACT_MISMATCH','runner_executed':False,'runtime_observations_claimed':False,'final_reliability_decision_claimed':False}); sys.exit(2)
write_status({'status':'RAN_LOCAL_FIXTURE','runner_executed':True,'runtime_observations_claimed':True,'final_reliability_decision_claimed':False,'broker_runtime_claimed':False,'production_runtime_claimed':False,'scope':'BOUNDED_LOCAL_FIXTURE_ONLY','observations':obs,'provenance_sha256':prov}); sys.exit(0)
