#!/usr/bin/env python3
import importlib.util
import json
import re
import time
from datetime import datetime
from pathlib import Path

PROJECT = Path('/data/video-pipeline/Youtube-Video-Maker/Project/31052026-001-Nguyen-Hue-Quang-Trung')
BASE = PROJECT / 'scripts_retry_step06_first50_minimal_no_refs.py'
LOG = PROJECT / 'logs/step06_first50_images_run.log'
MAN = PROJECT / 'logs/step06_first50_until_done_manifest.json'

spec = importlib.util.spec_from_file_location('minimal', BASE)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)


def log(msg):
    line = f"[{datetime.now().isoformat(timespec='seconds')}] {msg}"
    print(line, flush=True)
    with LOG.open('a', encoding='utf-8') as f:
        f.write(line + '\n')


def sleep_for_error(error, attempt):
    err = (error or '').lower()
    if '429' in err or 'too many requests' in err:
        wait = min(900, 180 + attempt * 60)
    elif 'terminated' in err:
        wait = min(300, 60 + attempt * 30)
    else:
        wait = min(300, 45 + attempt * 15)
    log(f"Backoff {wait}s after error: {err[-160:]}")
    time.sleep(wait)

scenes = json.loads((PROJECT/'script/scenes.json').read_text(encoding='utf-8'))['scenes'][:50]
results = []
attempts = {}
while True:
    missing = [s for s in scenes if not (PROJECT/'images/scenes'/f"{s['scene_id']}.png").exists()]
    if not missing:
        status = 'completed_limited_50_pending_review'
        break
    s = missing[0]
    sid = s['scene_id']
    attempts[sid] = attempts.get(sid, 0) + 1
    log(f"Until-done retry {sid} attempt {attempts[sid]}")
    res = mod.gen(s)
    results.append(res)
    log(f"Until-done {sid} {res['status']}")
    MAN.write_text(json.dumps({'status':'running','results':results,'remaining_missing':[x['scene_id'] for x in missing],'attempts':attempts}, ensure_ascii=False, indent=2), encoding='utf-8')
    if res['status'] == 'failed':
        sleep_for_error(res.get('error',''), attempts[sid])
        continue
    time.sleep(3)

out = {'status': status, 'results': results, 'attempts': attempts, 'remaining_missing': []}
MAN.write_text(json.dumps(out, ensure_ascii=False, indent=2), encoding='utf-8')
log('Reached 50/50 images. Stopping before thumbnails and scene_051.')
print(json.dumps(out, ensure_ascii=False, indent=2))
