#!/usr/bin/env python3
"""Validate the selected evidence inventory and settled frame integrity."""
from pathlib import Path
from PIL import Image,ImageChops
import json,hashlib,subprocess
R=Path('/tmp/issue-lead-33252-r2/evidence-capture');M=json.loads((R/'manifest.json').read_text())
errors=[];hashes={};video_count=0;stable=0
assert len(M)==56
for e in M:
 for side in ('before','after'):
  p=Path(e[side]);im=Image.open(p)
  expected=(e['width'],900 if e['width']==1440 else 844)
  if im.size!=expected:errors.append(str(p)+' viewport mismatch')
  env=json.loads(Path(e[side+'Environment']).read_text())
  if env['viewport']!=list(expected) or env['dpr']!=1 or not env['reducedMotion'] or env['clock']!='2026-11-09T09:40:00.000Z':errors.append(str(p)+' environment mismatch')
  folder=Path(e[side+'Source']);stem={'L':'L-loading','P':'P','E':'E'}.get(e['row'],'initial')
  a=folder/(stem+'-stability-a.png');b=folder/(stem+'-stability-b.png')
  if ImageChops.difference(Image.open(a).convert('RGB'),Image.open(b).convert('RGB')).getbbox():errors.append(str(p)+' unsettled')
  else:stable+=1
  if side+'Video' in e:
   video_count+=1
   data=json.loads(subprocess.check_output(['ffprobe','-v','error','-show_entries','stream=width,height','-of','json',e[side+'Video']]))['streams'][0]
   if (data['width'],data['height'])!=expected:errors.append(e[side+'Video']+' encoded viewport mismatch')
 for key,value in e.items():
  if key.endswith('Source') or not isinstance(value,str):continue
  p=Path(value)
  if p.is_file():
   if '.private.' in p.name or p.suffix=='.jsonl':errors.append('Private file selected')
   hashes[p.name]=hashlib.sha256(p.read_bytes()).hexdigest()
revisions={side:subprocess.check_output(['git','-C','/home/ubuntu/wt/issue-33252'+('-before' if side=='before' else ''),'rev-parse','HEAD'],text=True).strip() for side in ('before','after')}
assert revisions=={'before':'c6ca6056309904f89b90b6055d797973be0a0939','after':'21e22d030ca430ef680082630274b3b1c073d35c'}
report={'revisions':revisions,'rowsCaptured':sorted({e['row'] for e in M}),'matrixRows':14,'beforeAfterPairs':len(M),'stableStills':stable,'recordings':video_count,'diffThresholds':[0,16],'errors':errors,'sha256':hashes}
(R/'validation.json').write_text(json.dumps(report,indent=2))
print(json.dumps({k:v for k,v in report.items() if k!='sha256'},indent=2))
if errors:raise SystemExit(1)
