import concurrent.futures
import json
import time
import control as c

jobs=[(clip,model) for clip in c.CLIPS for model in ['stgcnpp','posec3d','ava_slowonly','yowov2']]
active={};started=time.monotonic();last_report=0
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as pool:
    while jobs or active:
        if time.monotonic()-started>10800: raise TimeoutError('Render scheduler deadline')
        query="import pathlib,json; r=pathlib.Path("+repr(c.REMOTE)+"); print(json.dumps({str(p.relative_to(r)):json.loads(p.read_text()).get('status') for p in r.glob('clips/*/reports/*_summary.json')}))"
        available=json.loads(c.checked(['python3','-c',query]))
        for job in jobs[:]:
            if len(active)>=3: break
            clip,model=job
            if available.get(f'clips/{clip}/reports/{model}_summary.json')=='PASS':
                active[pool.submit(c.trial,'render',clip,model)]=job; jobs.remove(job)
        for future in list(active):
            if future.done():
                future.result(); del active[future]
        if time.monotonic()-last_report>45:
            print('RENDER_PROGRESS',dict(waiting=len(jobs),active=list(active.values()),complete=28-len(jobs)-len(active)),flush=True)
            last_report=time.monotonic()
        time.sleep(5)
c.snapshot('after_render')
