from ops import *
result=[]
for mode in ('on-r2','off'):
    for file in sorted((HERE/mode).glob('stage-*.json')):
        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]; pa,pb=ac['publisher_metrics'],bc['publisher_metrics']
            ta=next(iter(pa.get('profile',{}).get('channels',{}).values()),{}).get('timings',{})
            tb=next(iter(pb.get('profile',{}).get('channels',{}).values()),{}).get('timings',{})
            transport={}
            for k,v in tb.items():
                old=ta.get(k,{});n=v['count']-old.get('count',0)
                transport[k]=dict(count=n,mean_ms=(v['mean_ms']*v['count']-old.get('mean_ms',0)*old.get('count',0))/n if n else None,
                    window_max_ms=v['max_ms'],recent_p95_ms=v['recent_p95_ms'],recent_samples=v['recent_samples'])
            providers={}
            for p,v in bc['providers'].items():
                ap=ac['providers'][p]['metadata_path'];bp=v['metadata_path']
                x=pa.get('relay_timing',{}).get(p,{});y=pb.get('relay_timing',{}).get(p,{})
                n=y.get('count',0)-x.get('count',0)
                providers[p]=dict(freshness_enabled=bp['freshness_enabled'],capacity=bp['capacity'],
                    over100ms=bp.get('over_freshness_'+p,0)-ap.get('over_freshness_'+p,0),
                    evicted=bp.get('frame_evicted',0)-ap.get('frame_evicted',0),
                    ready_to_parent_enqueue_ms=(y.get('sum_ns',0)-x.get('sum_ns',0))/n/1e6 if n else None,
                    inflight_age_peak_s=max(s['channels'][c]['providers'][p]['metadata_path'].get('inflight_age_s',0) for s in samples),
                    pending_age_peak_s=max(s['channels'][c]['providers'][p]['metadata_path'].get('pending_age_s',0) for s in samples))
            rows.append(dict(camera=c,providers=providers,transport=transport,
                replaced=pb.get('replaced',0)-pa.get('replaced',0),send_errors=pb.get('send_error',0)-pa.get('send_error',0)))
        result.append(dict(mode=mode,level=stage['level'],channels=rows))
save('supplement.json',result)
print(json.dumps([dict(mode=s['mode'],level=s['level'],channels=len(s['channels'])) for s in result]))
