from ops import *
import statistics
result=[]
for file in sorted((HERE/'pose').glob('stage-*.json'),key=lambda p:int(p.stem.split('-')[1])):
    stage=json.loads(file.read_text());samples=stage['samples'];a,b=samples[0],samples[-1];rows=[]
    for c,bc in b['channels'].items():
        ac=a['channels'][c];x=ac['providers']['pose']['metadata_path'];y=bc['providers']['pose']['metadata_path']
        pa,pb=ac['publisher_metrics'],bc['publisher_metrics']
        counts={k:y.get(k,0)-x.get(k,0) for k in ('admitted','frame_evicted','over_freshness_pose','accepted_result','finalized','events_created')}
        timing={}
        for name,end in y['provider_timing']['pose'].items():
            start=x['provider_timing']['pose'].get(name,{});n=end['count']-start.get('count',0)
            timing[name]=dict(count=n,mean_ms=(end['sum_ms']-start.get('sum_ms',0))/n if n else None,
                             over100ms=end['over_100ms']-start.get('over_100ms',0),run_max_ms=end['max_ms'])
        rows.append(dict(camera=c,counts=counts,timing=timing,
            over100_pct=100*counts['over_freshness_pose']/counts['accepted_result'] if counts['accepted_result'] else None,
            inflight_age_peak_s=max(s['channels'][c]['providers']['pose']['metadata_path'].get('inflight_age_s',0) for s in samples),
            pending_age_peak_s=max(s['channels'][c]['providers']['pose']['metadata_path'].get('pending_age_s',0) for s in samples),
            last_response_age_peak_s=max(s['channels'][c]['providers']['pose']['metadata_path']['providers']['pose'].get('last_response_age_s',0) for s in samples),
            send_errors=pb.get('send_error',0)-pa.get('send_error',0),replaced=pb.get('replaced',0)-pa.get('replaced',0),
            sender_timing='NOT_MEASURED: single child metrics command enables ingress/pipeline only',
            parent_relay='NOT_APPLICABLE: single provider child writes Redis directly'))
    result.append(dict(level=stage['level'],channels=rows))
save('supplement.json',result)
print(json.dumps([dict(level=s['level'],over100_pct=statistics.mean(c['over100_pct'] for c in s['channels']),
    events=sum(c['counts']['events_created'] for c in s['channels'])) for s in result]))
