from pathlib import Path
import json
import re
import time
import urllib.request

PROJECT = Path('/data/video-pipeline/Channel-Loi-Co-Nhan/project/13062026-050-Cua-Cho-Khong-Bang-Cach-Cho')
TTS_URL = 'http://192.168.1.201:3900/generate'
REF_AUDIO = Path('/data/video-pipeline/Youtube-Video-Maker/data/voices/template1/refaudio.mp3')
REF_TEXT = Path('/data/video-pipeline/Youtube-Video-Maker/data/voices/template1/reftext.txt')
TTS_SPEED = '0.95'


def multipart(fields, files):
    boundary = '----HermesIntroTTS050'
    chunks = []
    for key, value in fields.items():
        chunks.append(
            f'--{boundary}\r\nContent-Disposition: form-data; name="{key}"\r\n\r\n{value}\r\n'.encode()
        )
    for key, path in files.items():
        chunks.append(
            f'--{boundary}\r\nContent-Disposition: form-data; name="{key}"; filename="{path.name}"\r\n'
            f'Content-Type: audio/mpeg\r\n\r\n'.encode()
            + path.read_bytes()
            + b'\r\n'
        )
    chunks.append(f'--{boundary}--\r\n'.encode())
    return boundary, b''.join(chunks)


def main():
    scenes = json.loads((PROJECT / 'script/scenes.json').read_text(encoding='utf-8'))
    title = scenes['title'].split('|')[0].strip()
    intro_text = f'Cổ nhân dạy: {title}.'
    intro_text = re.sub(r'\s*[:;\-–—]\s*', ', ', intro_text).strip()
    out = PROJECT / 'output/intro/intro_audio.wav'
    out.parent.mkdir(parents=True, exist_ok=True)
    backup = out.with_suffix('.wav.bad_backup')
    if out.exists():
        out.replace(backup)
    ref_text = REF_TEXT.read_text(encoding='utf-8') if REF_TEXT.exists() else ''
    fields = {
        'text': intro_text,
        'language': 'vi',
        'ref_text': ref_text,
        'speed': TTS_SPEED,
        'num_step': '24',
        'guidance_scale': '2.0',
        'effect_preset': 'broadcast',
    }
    for attempt in range(1, 6):
        try:
            boundary, body = multipart(fields, {'ref_audio': REF_AUDIO})
            req = urllib.request.Request(
                TTS_URL,
                data=body,
                headers={'Content-Type': 'multipart/form-data; boundary=' + boundary},
                method='POST',
            )
            with urllib.request.urlopen(req, timeout=180) as response:
                blob = response.read()
            if not (blob[:4] == b'RIFF' and b'WAVE' in blob[:12]):
                raise RuntimeError(blob[:120])
            out.write_bytes(blob)
            (PROJECT / 'logs/intro_tts_regenerate_manifest.json').write_text(
                json.dumps(
                    {
                        'status': 'completed',
                        'text': intro_text,
                        'output_path': str(out),
                        'backup_path': str(backup) if backup.exists() else None,
                        'tts_url': TTS_URL,
                        'speed': TTS_SPEED,
                    },
                    ensure_ascii=False,
                    indent=2,
                ),
                encoding='utf-8',
            )
            print('DONE intro TTS', out)
            return
        except Exception as exc:
            print(f'RETRY intro TTS attempt {attempt}: {type(exc).__name__} {exc}')
            time.sleep(min(30 * attempt, 180))
    raise SystemExit('intro TTS failed')


if __name__ == '__main__':
    main()
