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=[]; pkg=f.get('package') or {}; target=f.get('target') or {}; review=f.get('review') or {}
    expected=expected_decision(f)
    qids=sorted(i.get('source_resource_id') for i in (f.get('import_result') or []) if i.get('quarantined'))
    checks={
      'package_id':pkg.get('package_id'),'manifest_version':pkg.get('manifest_version'),'target_profile_id':target.get('profile_id'),
      'package_decision':expected,'quarantined_resource_ids':qids,'review_state':review.get('state'),'audit_event_id':review.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()
