"""Deixa o Legendei pronto pra usar. Pode rodar quantas vezes quiser.

O que ele faz, nesta ordem:
  1. confere o Python e o ffmpeg
  2. cria o ambiente isolado (.venv) e instala as bibliotecas
  3. baixa as 67 fontes das legendas
  4. baixa o modelo que escuta o audio (~465 MB, so na primeira vez)

Nada aqui depende de internet depois da primeira vez.
"""
import os
import shutil
import subprocess
import sys
import urllib.request
from pathlib import Path

RAIZ = Path(__file__).resolve().parent
VENV = RAIZ / ".venv"
PY_VENV = VENV / ("Scripts/python.exe" if os.name == "nt" else "bin/python")
MIN_PY = (3, 10)

# o mesmo procurador de ffmpeg que o servidor usa, pra os dois concordarem
sys.path.insert(0, str(RAIZ / "app"))
from util import achar_ffmpeg  # noqa: E402


def titulo(n, total, texto):
    print(f"\n[{n}/{total}] {texto}")


def erro(msg, comojeito=""):
    print(f"\n  PAROU AQUI: {msg}")
    if comojeito:
        print(f"  Como resolver: {comojeito}")
    sys.exit(1)


def rodar(cmd, **kw):
    r = subprocess.run(cmd, cwd=RAIZ, **kw)
    return r.returncode == 0


def tem_internet() -> bool:
    try:
        urllib.request.urlopen("https://raw.githubusercontent.com", timeout=8)
        return True
    except Exception:  # noqa: BLE001
        return False


def main():
    print("=" * 58)
    print("  Legendei - instalacao")
    print("=" * 58)
    total = 4

    # 1. Python e ffmpeg -----------------------------------------------------
    titulo(1, total, "Conferindo o que ja existe no computador")
    if sys.version_info < MIN_PY:
        erro(f"este Python e o {sys.version_info.major}.{sys.version_info.minor}, "
             f"e o programa precisa do {MIN_PY[0]}.{MIN_PY[1]} ou mais novo",
             "instale em python.org e rode este instalador de novo")
    print(f"  Python {sys.version_info.major}.{sys.version_info.minor} ok")

    ffmpeg = achar_ffmpeg("ffmpeg")
    if not ffmpeg and "--instalar-ffmpeg" in sys.argv:
        print("  instalando o ffmpeg pelo winget (pode pedir permissao na tela)")
        subprocess.run(["winget", "install", "--id", "Gyan.FFmpeg", "-e",
                        "--accept-package-agreements", "--accept-source-agreements"])
        ffmpeg = achar_ffmpeg("ffmpeg")
    if not ffmpeg:
        erro("o ffmpeg nao esta instalado - e ele que monta o video",
             "rode assim, que ele resolve sozinho:\n"
             "                 python instalar.py --instalar-ffmpeg\n"
             "                 (ou instale na mao:  winget install Gyan.FFmpeg )")
    print(f"  ffmpeg ok  ({ffmpeg})")

    # 2. ambiente isolado ----------------------------------------------------
    titulo(2, total, "Preparando o ambiente e as bibliotecas")
    if not PY_VENV.exists():
        print("  criando a pasta .venv (uma vez so)")
        if not rodar([sys.executable, "-m", "venv", str(VENV)]):
            erro("nao consegui criar o ambiente isolado (.venv)",
                 "apague a pasta .venv e rode de novo")
    if not PY_VENV.exists():
        erro("o ambiente isolado ficou incompleto", "apague a pasta .venv e rode de novo")

    if not tem_internet():
        erro("sem internet - o instalador precisa baixar as bibliotecas e as fontes",
             "conecte e rode de novo")

    rodar([str(PY_VENV), "-m", "pip", "install", "--upgrade", "pip", "-q"])
    print("  instalando (a primeira vez demora alguns minutos)")
    if not rodar([str(PY_VENV), "-m", "pip", "install", "-q", "-r", str(RAIZ / "requirements.txt")]):
        erro("a instalacao das bibliotecas falhou",
             "confira a internet e rode de novo; a mensagem acima diz qual pacote deu problema")
    print("  bibliotecas ok")

    # 3. fontes --------------------------------------------------------------
    titulo(3, total, "Baixando as fontes das legendas")
    if not rodar([str(PY_VENV), str(RAIZ / "app" / "ferramentas" / "baixar_fontes.py")]):
        erro("nao consegui baixar as fontes", "rode o instalador de novo")

    # 4. modelo de transcricao ----------------------------------------------
    titulo(4, total, "Baixando o modelo que escuta o audio")
    print("  sao ~465 MB, so nesta primeira vez. Pode demorar.")
    env = dict(os.environ, HF_HOME=str(RAIZ / "models"))
    modelo = os.environ.get("LEGENDEI_MODEL", "small")
    codigo = ("from faster_whisper import WhisperModel;"
              f"WhisperModel({modelo!r}, device='cpu', compute_type='int8');"
              "print('  modelo ok')")
    if not rodar([str(PY_VENV), "-c", codigo], env=env):
        erro("nao consegui baixar o modelo de transcricao", "rode o instalador de novo")

    print("\n" + "=" * 58)
    print("  Tudo pronto.")
    print("=" * 58)
    print("\n  Para usar: abra o  iniciar.bat  (ou rode  python iniciar.py )")
    print("  O navegador abre sozinho em http://localhost:8123\n")


if __name__ == "__main__":
    main()
