from pathlib import Path
import json,sys
from gate_rules import inspect, expected_decision

def load(p): return json.loads(Path(p).read_text(encoding='utf-8'))
def validate_submission(f,s):
    errors=[]; esc=f.get('escalation') or {}; review=f.get('review') or {}; mentor=f.get('mentor') or {}
    expected=expected_decision(f)
    checks={'mentor_ref':(mentor.get('mentor_ref')),'review_sample_id':(f.get('sample') or {}).get('review_sample_id'),'rubric_version':review.get('rubric_version'),'bounded_decision':expected,'escalation_id':esc.get('escalation_id'),'audit_event_id':f.get('audit_event_id')}
    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=='HOLD' and s.get('validation_state') not in {'FAIL','UNKNOWN','PARTIAL'}: errors.append('STATE:validation_state must fail closed')
    if expected!='HOLD' 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')
    return errors

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]); issues=inspect(f); errs=validate_submission(f,s)
    out={'fixture_id':f.get('fixture_id'),'fixture_issues':issues,'bounded_decision':expected_decision(f),'submission_errors':errs,'status':'PASS' if not errs else 'FAIL'}
    print(json.dumps(out,ensure_ascii=False,indent=2)); raise SystemExit(0 if not errs else 1)
if __name__=='__main__': main()
