"""Trascrizioni dei video italiani che il portale gia' elenca per ogni gioco.

Servono a capire come funziona un gioco prima di scriverne, non a copiare:
il testo delle slide si scrive con parole nostre.

Preferisce sempre le trascrizioni scritte a mano dall'autore del video, che
hanno punteggiatura e nomi propri giusti. Quelle automatiche sono un ripiego:
sui nomi sbagliano parecchio ("dito enzo caledonia" per "Clans of Caledonia").

Va eseguito con l'interprete del venv:
    .venv/bin/python trascrizioni.py OLqV9FS8GC8
"""
import json, os, re, sys

QUI = os.path.dirname(os.path.abspath(__file__))
CACHE = os.path.join(os.path.dirname(QUI), "dati", "cache", "trascrizioni")


def _pulisci(t):
    t = re.sub(r"\[[^\]]{1,20}\]", " ", t)        # [Musica], [Applausi]
    return re.sub(r"\s+", " ", t).strip()


def trascrizione(video_id, usa_cache=True, ammetti_inglese=False):
    """Restituisce {'testo', 'tipo', 'lingua'} o {'errore'}. tipo: manuale|automatica.

    Con ammetti_inglese=True ripiega sull'inglese quando l'italiano non c'e'.
    Serve per i giochi che in italiano nessuno ha mai spiegato su YouTube
    (Noctiluca, 2026-09-01). Il campo 'lingua' dice sempre cosa si e' letto, e
    va riportato nella scheda del gioco: una fonte inglese non e' la stessa cosa,
    perche' i termini di regolamento italiani vanno poi verificati altrove.
    """
    os.makedirs(CACHE, exist_ok=True)
    percorso = os.path.join(CACHE, f"{video_id}{'-en' if ammetti_inglese else ''}.json")
    if usa_cache and os.path.exists(percorso):
        try:
            with open(percorso, encoding="utf-8") as f:
                return json.load(f)
        except (json.JSONDecodeError, OSError):
            pass

    from youtube_transcript_api import YouTubeTranscriptApi
    api = YouTubeTranscriptApi()
    try:
        elenco = api.list(video_id)
        scelta = tipo = None
        for t in elenco:                       # prima le manuali, poi le automatiche
            if t.language_code.startswith("it") and not t.is_generated:
                scelta, tipo = t, "manuale"
                break
        if scelta is None:
            for t in elenco:
                if t.language_code.startswith("it"):
                    scelta, tipo = t, "automatica"
                    break
        if scelta is None and ammetti_inglese:
            for t in elenco:
                if t.language_code.startswith("en"):
                    scelta, tipo = t, "manuale" if not t.is_generated else "automatica"
                    break
        if scelta is None:
            manca = "italiana o inglese" if ammetti_inglese else "italiana"
            return {"errore": f"nessuna trascrizione {manca}", "video": video_id}
        testo = _pulisci(" ".join(s["text"] for s in scelta.fetch().to_raw_data()))
        d = {"testo": testo, "tipo": tipo, "lingua": scelta.language_code,
             "caratteri": len(testo), "video": video_id}
    except Exception as e:
        return {"errore": f"{type(e).__name__}: {str(e)[:160]}", "video": video_id}

    with open(percorso, "w", encoding="utf-8") as f:
        json.dump(d, f, ensure_ascii=False)
    return d


if __name__ == "__main__":
    argomenti = sys.argv[1:]
    inglese = "--inglese" in argomenti
    for vid in [a for a in argomenti if not a.startswith("--")]:
        t = trascrizione(vid, ammetti_inglese=inglese)
        if t.get("errore"):
            print(f"{vid}: {t['errore']}")
        else:
            print(f"\n### {vid} ({t['tipo']}, {t['lingua']}, {t['caratteri']} caratteri)\n{t['testo']}")
