"""Own event-evidence ledger, not a SIP stack, real capture or billing engine."""
import json
def inspect(events):
    answers=[e['ms'] for e in events if e.get('kind')=='response' and e.get('call_id')=='demo' and e.get('cseq')==7 and e.get('method')=='INVITE' and e.get('status')==200]
    packets=[e['ms'] for e in events if e.get('kind')=='rtp_arrival']
    first=min(answers) if answers else None
    return {'invite_acceptance_observed':bool(answers),'first_matching_INVITE_200_ms':first,'media_arrival_observed':bool(packets),'RTP_before_matching_acceptance_observed':bool(packets) and (first is None or min(packets)<first),'local_ring_generation_observed':any(e.get('kind')=='local_ring_generation' for e in events),'human_conversation_proven':None,'billing_start_proven':None,'capture_completeness_proven':False}
def response(ms,status,method='INVITE',cseq=7):return {'kind':'response','ms':ms,'status':status,'method':method,'cseq':cseq,'call_id':'demo'}
def demo():
    fixtures={
      'local_ring_only':[response(10,180),{'kind':'local_ring_generation','ms':12}],
      'early_media_then_cancel':[response(10,183),{'kind':'rtp_arrival','ms':20},response(30,200,'CANCEL'),response(40,487)],
      'early_media_then_INVITE_acceptance':[response(10,183),{'kind':'rtp_arrival','ms':20},response(30,200),{'kind':'ACK','ms':35}],
      'wrong_transaction_200':[response(10,200,'OPTIONS'),response(20,200,'INVITE',8),response(30,183)]}
    rows=[{'case':name,'events':events,'evidence':inspect(events)} for name,events in fixtures.items()]
    assert [r['evidence']['invite_acceptance_observed'] for r in rows]==[False,False,True,False]
    assert rows[1]['evidence']['RTP_before_matching_acceptance_observed']
    assert all(r['evidence']['human_conversation_proven'] is None for r in rows)
    return {'authored_cases':rows,'single_leg_simplified_fixture':True,'no_packet_payload_decoded':True,'real_calls_or_packets_or_provider_billing_checked':False,'absence_of_observation_not_proof_of_absence':True}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
