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

PROJECT = Path('/data/video-pipeline/Youtube-Video-Maker/Project/28052026-002-Tran-Quang-Dieu-Bui-Thi-Xuan')
MOD_PATH = PROJECT / 'scripts_run_step_07_tts_v2.py'
AUDIO_DIR = PROJECT / 'audio/scenes'
MANIFEST = PROJECT / 'logs/step_07_tts_v2_manifest.json'
TEXT_MANIFEST = PROJECT / 'script/tts_text_manifest.json'

spec = importlib.util.spec_from_file_location('step7', MOD_PATH)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)

def log(msg):
    print(time.strftime('%Y-%m-%d %H:%M:%S ') + msg, flush=True)

def main():
    scenes = json.loads((PROJECT/'script/scenes.json').read_text(encoding='utf-8'))['scenes']
    missing = [s for s in scenes if not (AUDIO_DIR/f"{s['scene_id']}.wav").exists()]
    log('MISSING '+json.dumps([s['scene_id'] for s in missing], ensure_ascii=False))
    results = []
    for s in missing:
        tts, changes = mod.normalize(s['narration'])
        item = {'scene_id': s['scene_id'], 'narration': s['narration'], 'tts_text': tts, 'normalization': changes, 'output': str(AUDIO_DIR/f"{s['scene_id']}.wav")}
        r = mod.generate(item)
        results.append(r)
        log(f"{r['status']} {r['scene_id']} {r.get('bytes',0)} dur={r.get('duration')}")
    if TEXT_MANIFEST.exists():
        tm = json.loads(TEXT_MANIFEST.read_text(encoding='utf-8'))
    else:
        tm = {'project_id': PROJECT.name, 'items': []}
    existing_items = {it['scene_id']: it for it in tm.get('items', [])}
    for s in scenes:
        tts, changes = mod.normalize(s['narration'])
        existing_items[s['scene_id']] = {'scene_id': s['scene_id'], 'narration': s['narration'], 'tts_text': tts, 'normalization': changes, 'output': str(AUDIO_DIR/f"{s['scene_id']}.wav")}
    tm['items'] = [existing_items[s['scene_id']] for s in scenes]
    TEXT_MANIFEST.write_text(json.dumps(tm, ensure_ascii=False, indent=2), encoding='utf-8')
    # Rebuild manifest from current wav files, preserving fresh results where available.
    by_id = {r['scene_id']: r for r in results if r['status'] == 'ok'}
    all_results = []
    for s in scenes:
        sid = s['scene_id']; p = AUDIO_DIR/f'{sid}.wav'
        if sid in by_id:
            all_results.append(by_id[sid])
        elif p.exists():
            all_results.append({'scene_id': sid, 'status': 'ok', 'output': str(p), 'bytes': p.stat().st_size, 'duration': mod.duration(p)})
        else:
            all_results.append({'scene_id': sid, 'status': 'failed', 'output': str(p), 'error': 'missing_after_regenerate'})
    failed = [r for r in all_results if r['status'] == 'failed']
    doc = {'project_id': PROJECT.name, 'step': 7, 'version': 'v2_pause_roman_fix_missing_regen', 'status': 'completed' if not failed else 'partial_failed', 'total_scenes': len(scenes), 'done': len(scenes)-len(failed), 'failed': failed, 'total_duration_seconds': sum((r.get('duration') or 0) for r in all_results), 'results': all_results}
    MANIFEST.write_text(json.dumps(doc, ensure_ascii=False, indent=2), encoding='utf-8')
    log('DONE '+json.dumps({'status': doc['status'], 'done': doc['done'], 'duration_min': round(doc['total_duration_seconds']/60, 2)}, ensure_ascii=False))
    if failed:
        raise SystemExit('partial_failed')

if __name__ == '__main__':
    main()
