#!/usr/bin/env python3
"""Gera ASS karaoke (estilo Hermes adaptado) pra vídeo 1080x1920 da chácara."""
import json
from pathlib import Path

base = Path('/opt/mia/workspace/clientes/chacara-sonho-verde/videos_meta')
d = json.loads((base / 'transcript/chacara_v2.json').read_text())

CORRECOES = {
    'chá': 'Chácara',
    'cara': 'Chácara',
    'cara.': 'Chácara.',
    'cara,': 'Chácara,',
    'valinhos.': 'Valinhos.',
    'valinhos,': 'Valinhos,',
    'nesse': 'inesquecível',
    'possível.': '.',
    'o ar': 'ao ar',
    'ocomodações': 'acomodações',
    'a comodações': 'acomodações',
    'óspedes.': 'hóspedes.',
    'espassosa,': 'espaçosa,',
    'convidadas.': 'convidados.',
    'essas': 'seus',
    'sonho': 'Sonho',
    'verde': 'Verde',
    'top': 'Top',
    'top.': 'Top.',
    'top,': 'Top,',
    'São': 'São',
    'Paulo.': 'Paulo.',
    'Está': 'Está',
}

def norm(word_raw: str) -> str:
    w = word_raw.strip()
    lw = w.lower()
    if lw in CORRECOES:
        return CORRECOES[lw]
    for prefix, repl in CORRECOES.items():
        if lw == prefix:
            return repl
    return w

def ass_time(t: float) -> str:
    h = int(t // 3600)
    m = int((t % 3600) // 60)
    s = t % 60
    return f'{h}:{m:02d}:{s:05.2f}'

# Header 1080x1920 — fonte ~56pt pra ter proporção visual similar ao 606x1080/38pt do Hermes
header = (
    "[Script Info]\n"
    "ScriptType: v4.00+\n"
    "PlayResX: 1080\n"
    "PlayResY: 1920\n"
    "ScaledBorderAndShadow: yes\n"
    "WrapStyle: 2\n"
    "\n"
    "[V4+ Styles]\n"
    "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
    "Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, "
    "Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n"
    "Style: Karaoke,DejaVu Sans,56,&H00FFFFFF,&H00FFFFFF,&H00101010,&H90101010,1,0,0,0,100,100,0,0,"
    "1,4,2,2,60,60,220,1\n"
    "\n"
    "[Events]\n"
    "Format: Layer, Start, End, Style, Name, MarginL, MarginR, Effect, Text\n"
)

# Monta linhas (quebra automática por largura de ~22 caracteres pra caber bem no 1080px com fonte 56)
MAX_CHARS_PER_LINE = 22

segs = [s for s in d['segments'] if s.get('words')]
lines = []
for s in segs:
    words = s['words']
    chunks = []
    acc = []
    acc_chars = 0
    for w in words:
        token = norm(w['word'])
        token_len = len(token) + (1 if acc else 0)
        if acc and acc_chars + token_len > MAX_CHARS_PER_LINE:
            chunks.append(acc)
            acc = []
            acc_chars = 0
        acc.append(w)
        acc_chars += token_len
    if acc:
        chunks.append(acc)

    for chunk in chunks:
        texts = [norm(w['word']) for w in chunk]
        for i, w in enumerate(chunk):
            start = float(w['start'])
            end = float(chunk[i + 1]['start']) if i + 1 < len(chunk) else float(w['end'])
            if end <= start:
                end = start + 0.08
            rendered = []
            for j, t in enumerate(texts):
                # Palavra ativa: amarelo. Inativa: branco. (ASS cores em BGR hex)
                color = '&H0000FFFF' if j == i else '&H00FFFFFF'
                rendered.append('{\\c' + color + '}' + t + '{\\c&H00FFFFFF}')
            lines.append(
                f'Dialogue: 0,{ass_time(start)},{ass_time(end)},Karaoke,,0,0,,{" ".join(rendered)}'
            )

(base / 'karaoke_v2.ass').write_text(header + '\n'.join(lines) + '\n', encoding='utf-8')
total_words = sum(len(s.get('words', [])) for s in segs)
print(f'wrote {len(lines)} events from {total_words} words -> karaoke_v2.ass')
