import json
import os
import pathlib
import sys

root=pathlib.Path('/eval'); name=sys.argv[1]; camera=False
assert name=='posec3d', 'Only PoseC3D is authorized'
summary=root/'reports'/f'{name}_summary.json'
if summary.exists() and json.loads(summary.read_text())['status']=='PASS':
    print('REUSE_MODEL_PASS',name); raise SystemExit(0)
rows=json.loads((root/'inputs/pose.json').read_text())
if camera and name=='yowov2':
    for file in ('outputs/yowov2.json','reports/yowov2_summary.json'):
        (root/file).write_bytes((pathlib.Path('/old')/file).read_bytes())
    print('REUSE_CAMERA24_YOWOV2'); raise SystemExit(0)
source=pathlib.Path('/basehelpers/evaluate.py').read_text()
def swap(a,b):
    global source
    assert a in source,a
    source=source.replace(a,b)
swap('evaluation_samples=list(range(100,301))',"evaluation_samples=json.loads((ROOT/'inputs/sampling_plan.json').read_text())['display_samples']")
swap("ground_truth='User visual observation: upper-left two fight throughout both loops; others bystanders. Not independent clips.'","ground_truth='User reports non-fight comparison input; no agent semantic verification or accuracy judgement'")
swap('source_display_frames=[242,723]','source_display_frames=json.loads((ROOT/\'inputs/sampling_plan.json\').read_text())[\'display_bounds\']')
swap("camera_id=24","camera_id=24 if camera else None")
swap("str(ROOT/'inputs/frames'/f'{index:04d}.png')","str((pathlib.Path('/old/inputs/frames') if camera else ROOT/'inputs/frames')/f'{index:04d}.png')")
swap("if outpath.exists() and oldsummary.exists():","if False:")
swap("img_shape=(1080,1920)","img_shape=(rows[0]['height'],rows[0]['width'])")
start=source.index('        h=((ba[3]-ba[1])')
end=source.index('    return sorted(out)',start)
source=source[:start]+'''        heights=(ba[3]-ba[1],bb[3]-bb[1])
        if not np.isfinite(np.r_[ba,bb]).all() or min(heights)<=0 or min(ba[2]-ba[0],bb[2]-bb[0])<=0:
            continue
        dx=max(0.,max(ba[0],bb[0])-min(ba[2],bb[2]))
        dy=max(0.,max(ba[1],bb[1])-min(ba[3],bb[3]))
        ratio=float(np.hypot(dx,dy)/min(heights))
        if ratio<=.25:
            out.append((sorted([a['track_id'],b['track_id']]),ratio))
'''+source[end:]
swap('transform=Compose(cfg.val_pipeline)',"for op in cfg.val_pipeline:\n            if op['type']=='UniformSampleFrames': op['clip_len']=16\n        transform=Compose(cfg.val_pipeline)")
swap("temporal_samples=100 if NAME=='stgcnpp' else 48","temporal_samples=16")
swap("bbox center distance / mean bbox height <= 1.8; spatial candidates only, not fight logic","bbox edge gap / min bbox height <= 0.25; spatial candidates only")
swap("indices=list(range(i-50,i+50)) if NAME=='stgcnpp' else list(range(i-24,i+24))","indices=list(range(i-8,i+8))")
swap("indices=[i-32,i-16,i,i+16]","indices=[i-10,i-5,i,i+5]")
swap("official AVA4x16 offsets [-32,-16,0,16] on common 10FPS; shortest-side256, no crop","AVA4x5 offsets [-10,-5,0,5] on common 10FPS; shortest-side256, no crop")
swap('w,h=455,256',"w,h=round(rows[0]['width']*256/rows[0]['height']),256")
swap('0,1920)*w/1920',"0,rows[i]['width'])*w/rows[i]['width']")
swap('0,1080)*h/1080',"0,rows[i]['height'])*h/rows[i]['height']")
swap('o[:4]*[1920,1080,1920,1080]',"o[:4]*[rows[i]['width'],rows[i]['height'],rows[i]['width'],rows[i]['height']]")
swap('assert len(results)==201',"assert len(results)==len(report['evaluation_samples'])")
swap("for i in report['evaluation_samples']:\n",'''for i in report['evaluation_samples']:
            offsets=(-8,7) if NAME in ('stgcnpp','posec3d') else ((-10,5) if NAME=='ava_slowonly' else (-15,0))
            if i+offsets[0]<0 or i+offsets[1]>=len(rows):
                results.append(dict(sample=i,source_frame=rows[i]['source_frame'],seconds=rows[i]['seconds'],window=None,items=[],status='INSUFFICIENT_WINDOW'))
                continue
''')
swap("r['window']=window(r['window']['samples'])","if r['window'] is not None: r['window']=window(r['window']['samples'])")
swap("known_loop_boundaries_crossed=[b for b in (242,483)","known_loop_boundaries_crossed=[b for b in json.loads((ROOT/'inputs/sampling_plan.json').read_text())['known_loop_boundaries']")
swap('inputs=transformed[\'inputs\'].unsqueeze(0).to(device)',"inputs=transformed['inputs'].unsqueeze(0).to(device)\n                assert inputs.shape[3]==16")
(root/'reports'/f'{name}_executed.py').write_text(source)
exec(compile(source,'evaluate_executed.py','exec'),{'__name__':'__main__','camera':camera})
