"""Independent readback of time, dedup, counters, display, and frozen selection."""
import bootstrap
from bootstrap import BASELINE
from collections import Counter,defaultdict
import hashlib
import json
from pathlib import Path
from inputs import OUT


def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()


def main():
    specs=json.loads((OUT/'specs.json').read_text());manifest=json.loads((OUT/'candidates.json').read_text())
    assert len(specs)==37 and len(manifest['representative_clips'])==9 and len(manifest['candidates'])==1 and manifest['frozen']
    cfg=manifest['candidates'][0]['config'];checks=[];keys=defaultdict(list);all_rows=0;total_frames=0
    for clip,spec in specs.items():
        data=OUT/'download'/clip/'data';s=json.loads((data/'summary.json').read_text())
        assert s['candidate_sha256']==sha(OUT/'candidates.json') and s['sha256']==sha(data/s['trace'])
        views=[json.loads(line) for line in (OUT/'work'/clip/'enriched.jsonl').read_text().splitlines()]
        rows=[json.loads(line) for line in (data/s['trace']).read_text().splitlines()]
        assert [(r['sample'],r['source_frame'],r['seconds']) for r in views]==[(r['sample'],r['source_frame'],r['seconds']) for r in rows]
        shown=[r for r in rows if r['displayed']];assert [r['sample'] for r in shown]==spec['selected_samples']
        assert len(shown)==s['stats']['displayed'];all_rows+=len(shown)
        histories={};last_hit=None;last_event=None;past=None;hist_hits={}
        for view,r in zip(views,rows):
            t=r['seconds'];assert past is None or t>past;past=t
            assert r['hit']==any(p['hit'] for p in r['pairs'])
            for b in view['bodies']:
                assert .25<=b['score']<=1
                assert all(.10<=p[2]<=1 for p in b['joints'].values())
            for p in r['pairs']:
                h=histories.setdefault(p['token'],[])
                if p['reset']:h.clear();hist_hits.pop(p['token'],None)
                h[:]=[x for x in h if t-x[0]<=cfg['window']+1e-8]
                flags=[any(f['actor']==a and f['rules'] for f in p['diagnostics']) for a in (0,1)]
                h.append((t,flags));assert p['counts']==[sum(x[1][a] for x in h) for a in (0,1)]
                for f in p['diagnostics']:
                    assert f['input_start']<f['input_end']==t and .055-1e-8<=f['elapsed']<=.30+1e-8
                    assert .1<=f['confidence']<=1 and set(f['rules'])<=set(f['rules_present'])
                    assert f['suppression_applied']==bool(f['suppressed_rules'])
                    if 'ARM_DIRECT' in f['rules'] or 'LEG_DIRECT' in f['rules']:
                        kind='hand' if f['kind']=='hand' else 'foot'
                        assert f['speed']+1e-12>=cfg[kind+'_speed'] and f['near']<=cfg[kind+'_near']+1e-12
                        assert f['vertical']<=cfg[kind+'_vertical']+1e-12 and f['cosine']+1e-12>=cfg['direction']
                        assert f['approach']/f['elapsed']+1e-12>=cfg['approach']
                    if 'MUTUAL_HAND_CONTACT' in f['suppression_evidence']:
                        assert not set(f['rules'])&{'ARM_RETURN','CLOSE_REVERSAL'}
                    if 'CLOSE_REVERSAL' in f['rules']:
                        assert f['response_speed']>=cfg['response_min'] and f['response_motion']>=.02 and f['response_cosine']>=.25
                if p['hit']:
                    assert p['raw'] and p['observable'] and p['actors'];hist_hits[p['token']]=t
                    assert all(p['counts'][a]>=cfg['min_samples'] for a in p['actors'])
            if r['hit']:last_hit=t
            ep=r['episode']
            assert ep['display']==bool(r['hit'] or (ep['latched'] and last_hit is not None and t-last_hit<=1.+1e-8))
            if ep['event']:
                assert r['hit'] and (last_event is None or t-last_event>=2.-1e-8);last_event=t
            for g in r['groups']:
                assert len(g['orders'])>=2
                if g['state']=='RED_CURRENT':assert g['contributing_pairs']
                if g['state']=='YELLOW_HOLD':
                    assert not g['contributing_pairs'] and g['held_pairs']
                    assert all(0<t-ts<=1.+1e-8 and hist_hits[k]==ts for k,ts in g['hold_last_hit'].items())
            if r['displayed']:keys[r['dedupe_key']].append((clip,r['reference'],r['hit'],r['observable']))
        assert sum(r['hit'] for r in shown)==s['stats']['condition_frames']
        assert sum(r['episode']['display'] for r in shown)==s['stats']['display_frames']
        assert sum(r['episode']['event'] for r in shown)==len(s['stats']['test_events'])
        check=dict(clip=clip,displayed=len(shown),current=s['stats']['condition_frames'],events=len(s['stats']['test_events']),status='PASS')
        if clip in manifest['representative_clips']:
            v=json.loads((data/'video_validation.json').read_text());assert v['status']=='PASS' and v['frames']==len(shown)
            assert v['sha256']==sha(data.parent/'B_Integrated_Review.mp4');total_frames+=v['frames'];check['video']='PASS'
        checks.append(check)
    dedup=Counter();conflicts=0
    for k,values in keys.items():
        labels={v[1] for v in values};hits={v[2] for v in values}
        if len(hits)>1:conflicts+=1
        dedup[next(iter(labels)) if len(labels)==1 else 'reference_conflict']+=1
    result=dict(status='PASS',inputs=len(checks),videos=9,displayed=all_rows,video_frames=total_frames,
        unique_reference_frames=len(keys),repeated_source_frames=all_rows-len(keys),overlap_different_decisions=conflicts,
        deduplicated_reference_denominators=dict(dedup),checks=checks,causal=True,labels_not_engine_inputs=True,
        baseline_files_modified=False,operational_fps_quality='NOT_MEASURED')
    (OUT/'download/validation/technical_audit.json').write_text(json.dumps(result,indent=2))
    print(json.dumps({k:v for k,v in result.items() if k!='checks'}),flush=True)


if __name__=='__main__':main()
