"""Bounded CPU-only work; prior runs and operating services remain read-only."""
import concurrent.futures
import hashlib
import json
from pathlib import Path
import shutil
import sys

LOCAL=Path(__file__).resolve().parent.parent
BASE=LOCAL.parent
PRIOR=BASE/'2026-10-30_contextra-fight-robust-32clips_r01'
SOURCE=BASE/'2026-10-30_contextra-fight-integrated-37clips_r01'
sys.path.insert(0,str(BASE/'2026-10-29_contextra-fight-b-refine_r01/helpers'))
import control_refine as c
c.LOCAL=LOCAL;c.REMOTE=c.old.RB+'/'+LOCAL.name;c.PREFIX='contextra-approach-1030-r01-';c.REPORT=LOCAL/'reports'
PRIORITY=['01_camera24_fight','02_camera22_crowd','03_camera27_fall','07_KISA_fight_C00_015_0009',
          '08_KISA_fight_C00_018_0012','14_KISA_fall_C00_051_0002']
PRIORITY += ['SELF_'+x for x in ('C09','C10','C11','C12','C13','C14','C15','C16','C17','C19','L02')]


def sync():
    for p in [LOCAL/'helpers',*sorted(LOCAL.glob('*.json')),LOCAL/'checkpoint.ko.md',LOCAL/'design.ko.md']:
        c.old.scp(str(p),'si@58.233.207.31:'+c.REMOTE+'/')


def setup():
    c.REPORT.mkdir(exist_ok=True)
    c.checked_resources()
    assert c.old.checked(['docker','image','inspect',c.old.IMAGE,'--format','{{.Id}}']).decode().strip()==c.old.IMAGE
    c.old.checked(['test','!','-e',c.REMOTE])
    for name in ('specs.json','sources.json','self_maps.json','feedback.json','cases.json','baseline_fingerprints.json'):
        shutil.copy2(PRIOR/name,LOCAL/name)
    specs=c.read(LOCAL/'specs.json');assert len(specs)==32
    assert sum(len(v['selected_samples']) for v in specs.values())==18045
    assert len(specs['SELF_L02']['selected_samples'])==7261
    config=c.read(SOURCE/'candidates.json')['candidates'][0]['config']
    candidate=dict(schema='contextra.approach-link.v1',id='B_ApproachLink',frozen=True,
        status='COMPARISON_ONLY_NOT_ADOPTED',config=config,
        link=dict(progress=.025,motion=.06,confirmation_window=.30,link_gap=.30,continue_progress=.01,return_progress=.015),
        design_sha256=c.digest(LOCAL/'design.ko.md'))
    (LOCAL/'candidates.json').write_text(json.dumps(candidate,indent=2))
    contract=c.read(PRIOR/'execution_contract.json')
    contract.update(candidate='B_ApproachLink',selected_trial=None,status='CPU_COMPARISON_ONLY',
        frozen_at='2026-10-30T20:30:49+09:00',expected_videos=0,produced_videos=0,
        priority=PRIORITY,other=[n for n in specs if n not in PRIORITY],max_workers=2)
    (LOCAL/'execution_contract.json').write_text(json.dumps(contract,indent=2))
    refs={str(p.relative_to(BASE)):c.digest(p) for p in [PRIOR/'sources.json',PRIOR/'feedback.json',
        PRIOR/'reports/probe_robust_weak.json',PRIOR/'candidates.json',SOURCE/'candidates.json']}
    (LOCAL/'comparison_fingerprints.json').write_text(json.dumps(refs,indent=2))
    c.snapshot('before')
    c.old.checked(['mkdir',c.REMOTE],sudo=True);c.old.checked(['chown','si:si',c.REMOTE],sudo=True)
    c.old.checked(['chmod','700',c.REMOTE])
    c.old.checked(['mkdir','-p',c.REMOTE+'/work',c.REMOTE+'/download/validation',c.REMOTE+'/reports'])
    sync();print('SETUP_PASS inputs=32 displayed=18045 no model/baseline reexecution',flush=True)


def many(stage,group):
    names=c.read(LOCAL/'execution_contract.json')[group]
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool:
        for f in concurrent.futures.as_completed([pool.submit(c.run_job,stage,n) for n in names]):f.result()


if __name__=='__main__':
    action=sys.argv[1]
    if action=='setup':setup()
    elif action=='sync':sync()
    elif action=='one':c.run_job(sys.argv[2],sys.argv[3] if len(sys.argv)>3 else 'all')
    elif action=='many':many(sys.argv[2],sys.argv[3])
    elif action=='pull-reports':c.old.scp('si@58.233.207.31:'+c.REMOTE+'/reports/.',str(c.REPORT))
    elif action=='pull':c.old.scp('si@58.233.207.31:'+c.REMOTE+'/download/.',str(LOCAL/'Contextra_Fight_ApproachLink_Comparison_20261030'))
    elif action=='finish':c.finish()
    else:raise ValueError(action)
