import hashlib
import json
from pathlib import Path

root=Path(__file__).parent
d=json.loads((root/'camera24-observation.json').read_text())
frames={round(f['ptsNs']/1e9,6):f for f in d['frames']}
joined=[]
for s in d['samples']:
    n=s['notification']
    if not n:continue
    assert n['display_policy']['hold_seconds']==3 and not n['display_policy']['error']
    f=frames.get(round(n['last_pts'],6))
    if f is None:continue
    red=[o for o in f['objects'] if any(r['scenario']=='FIGHT' and r['state']=='FIGHT' for r in o['scenarioResults'])]
    assert bool(red)==n['display_active']
    assert all(o['color']=='#FF3030' for o in red)
    joined.append(dict(frame=f['frameSeq'],pts=f['ptsNs'],current=n['current_hit'],
                       red_objects=len(red),held=n['display_hold']['held']))
ages=[h['age_seconds'] for s in d['samples'] if s['notification'] for h in s['notification']['display_hold']['held']]
summary=dict(duration=d['duration'],redis_frames=len(d['frames']),diagnostic_samples=len(d['samples']),
    exact_pts_matches=len(joined),color_mismatches=0,max_observed_hold_age=max(ages or [0]),
    held_only_samples=sum(bool(j['held']) and not j['current'] for j in joined),
    run_unchanged=d['before']['run_id']==d['after']['run_id'],events=d['events'],
    policy=dict(version=1,hold_seconds=3),browser_acceptance='NOT_CHECKED',
    event_media_pixel_review='NOT_PERFORMED; shared result pipeline preserved',
    observation_sha256=hashlib.sha256((root/'camera24-observation.json').read_bytes()).hexdigest())
(root/'observation-summary.json').write_text(json.dumps(summary,indent=2))
(root/'observation-joins.json').write_text(json.dumps(joined,indent=2))
print(json.dumps(summary))
