#!/usr/bin/env python3
import argparse, hashlib, json, sys

def fail(msg):
    print('REFUSE: '+msg, file=sys.stderr); return 2

def main():
    ap=argparse.ArgumentParser()
    ap.add_argument('events')
    ap.add_argument('--head', required=True)
    args=ap.parse_args()
    prev='GENESIS'; seen=set(); rows=[]
    try:
        with open(args.events, encoding='utf-8') as f:
            for n,line in enumerate(f,1):
                e=json.loads(line); eid=e['event_id']
                if eid in seen: return fail('duplicate event_id')
                if e.get('prev_hash',prev)!=prev: return fail('head drift')
                payload=json.dumps({k:e[k] for k in ('event_id','kind','text','prev_hash')},sort_keys=True,separators=(',',':'))
                h=hashlib.sha256(payload.encode()).hexdigest()
                if e.get('hash')!=h: return fail(f'hash mismatch line {n}')
                seen.add(eid); rows.append(e); prev=h
    except (OSError, KeyError, json.JSONDecodeError) as ex: return fail(str(ex))
    if prev != args.head: return fail('head drift')
    obligations=[]
    for e in rows:
        if e['kind']=='obligation': obligations.append({'id':e['event_id'],'text':e['text']})
        elif e['kind']=='fulfilled': obligations=[o for o in obligations if o['id']!=e['text']]
    packet={'schema':'resume.packet.v1','validated_head_hash':prev,'open_obligations':obligations}
    packet['packet_hash']=hashlib.sha256(json.dumps(packet,sort_keys=True,separators=(',',':')).encode()).hexdigest()
    print(json.dumps(packet,sort_keys=True)); return 0
if __name__=='__main__': sys.exit(main())
