import bootstrap
import os,json
from data_robust import OUT,read,paths,lines,sha
from inputs import load,evidence
from contract import palette
import render_space as renderer

clip=os.environ['CLIP'];dest=OUT/'download'/clip;data=dest/'data'
check=read(data/'replay_validation.json');assert check['status']=='PASS' and sha(data/'R5_diagnostics.jsonl')==check['trace_sha256']
rows,chosen,spec,cache,maps=load(clip); colors=palette(rows); rows={r['sample']:r for r in rows if r['sample'] in chosen}
fp,_,_=paths(clip)
views={r['sample']:{k:r[k] for k in ('sample','source_frame','seconds','bodies','pairs','review_frame')} for r in lines(fp) if r['displayed']}
hashes=read(evidence(spec['rgb_hashes_remote']));entries=[]
for r in lines(data/'R5_diagnostics.jsonl'):
 if not r['displayed']:continue
 row=rows[r['sample']];view=views[r['sample']]
 assert (row['source_frame'],row['seconds'])==(r['source_frame'],r['seconds'])
 entries.append(dict(kind='observation',row=row,view=view,result=r,colors=colors,part_id=spec.get('part_id',''),path=cache/'frames'/f"{r['sample']:04d}.png",rgb_sha256=hashes[f"{r['sample']:04d}.png"],seconds=row['seconds']))
assert len(entries)==len(chosen)
original=renderer.text
def text(draw,rects,xy,value,*args,**kwargs):
 value=value.replace('싸움 통합 후보 · 공간 검토','R5 고정 후보 · 공간 검토')
 if clip=='SELF_L02' and value.startswith('입력 Frame '):
  n=int(value.split()[2]);value=value.replace(f'입력 Frame {n}',f'L02 Frame {n-2542} | L01 Frame {n}')
 if value.startswith('L01: 파트별'):value='L02: P02 독립 이력 · P01 연결 없음 · 실제 L01 PTS 사용'
 return original(draw,rects,xy,value,*args,**kwargs)
renderer.text=text
renderer.render(clip,entries,dest/'B_R5_Space_Review.mp4',data/'video_validation.json')
