"""Evidence-based mechanical grader. Does not score factual/semantic support."""
import argparse
import json
from runtime import Runtime, STEPS


def grade(snapshot, expected_status='succeeded'):
    events = snapshot['events']
    commits = [e['detail'] for e in events if e['kind'] == 'step_committed']
    cp = snapshot['checkpoints']
    checks = {'expected_terminal_state': snapshot['status'] == expected_status,
              'no_duplicate_checkpoint_commit': len(commits) == len(set(commits)),
              'trace_matches_checkpoints': set(commits) == set(cp)}
    if expected_status == 'succeeded':
        checks['all_steps_present'] = set(cp) == set(STEPS)
        checks['source_id_gate_passed'] = cp.get('verify', {}).get('schema_and_source_ids') is True
        checks['receipt_present'] = bool(cp.get('publish', {}).get('receipt'))
    return {'passed': all(checks.values()), 'checks': checks,
            'semantic_support': 'not_scored', 'model_quality': 'not_scored'}


if __name__ == '__main__':
    p = argparse.ArgumentParser()
    p.add_argument('--db', default='lab.sqlite')
    p.add_argument('--job', default='report-001')
    p.add_argument('--expected-status', default='succeeded', choices=['succeeded', 'failed', 'cancelled'])
    a = p.parse_args()
    r = Runtime(a.db)
    try:
        result = grade(r.snapshot(a.job), a.expected_status)
        print(json.dumps(result, ensure_ascii=False, indent=2))
        raise SystemExit(0 if result['passed'] else 1)
    finally:
        r.db.close()
