from pathlib import Path
import json,sys
from gate_rules import inspect_single,expected_single,inspect_transfer,expected_transfer

def load(p): return json.loads(Path(p).read_text(encoding='utf-8'))
def main():
    if len(sys.argv)!=3: raise SystemExit('usage: run_checks.py FIXTURE SUBMISSION')
    f=load(sys.argv[1]); s=load(sys.argv[2]); is_transfer='history' in f and 'candidate' in f
    issues=inspect_transfer(f) if is_transfer else inspect_single(f)
    expected=expected_transfer(f) if is_transfer else expected_single(f)
    errors=[]; checks={'fixture_id':f.get('fixture_id'),'bounded_decision':expected}
    for k,v in checks.items():
        if s.get(k)!=v: errors.append(f'STATE:{k}: expected {v!r} got {s.get(k)!r}')
    if expected in {'HOLD','INSUFFICIENT_EVIDENCE'} and s.get('validation_state') not in {'FAIL','UNKNOWN','PARTIAL'}: errors.append('STATE:validation_state must fail closed')
    if expected not in {'HOLD','INSUFFICIENT_EVIDENCE'} and s.get('validation_state') not in {'PASS','PARTIAL'}: errors.append('STATE:validation_state must be PASS/PARTIAL')
    if len(s.get('evidence_refs') or [])<3: errors.append('EVIDENCE: at least three evidence refs required')
    if len(str(s.get('rationale') or ''))<30: errors.append('RATIONALE: too short')
    if len(str(s.get('minimal_repair') or ''))<10: errors.append('REPAIR: too short')
    print(json.dumps({'fixture_id':f.get('fixture_id'),'fixture_issues':issues,'bounded_decision':expected,'submission_errors':errors,'status':'PASS' if not errors else 'FAIL'},ensure_ascii=False,indent=2))
    raise SystemExit(0 if not errors else 1)
if __name__=='__main__': main()
