"""
Descarga todos los videos usando las URLs ya capturadas en course_structure.json.
Nombre de archivo: {num:02d}.mp4  (garantiza unicidad sin depender del titulo)
"""
import json
import subprocess
import sys
from pathlib import Path

sys.stdout.reconfigure(encoding="utf-8")

SCRIPTS_DIR    = Path(__file__).parent
BASE_DIR       = SCRIPTS_DIR.parent
STRUCTURE_FILE = SCRIPTS_DIR / "course_structure.json"
VIDEOS_DIR     = BASE_DIR / "storage" / "app" / "course-media" / "curso-de-ingles-raio"

VIDEOS_DIR.mkdir(parents=True, exist_ok=True)

def log(msg, level="INFO"):
    icons = {"INFO": "  ", "OK": "[OK]", "SKIP": "[--]", "ERROR": "[!!]", "HEAD": "\n==="}
    print(f"{icons.get(level,'  ')} {msg}", flush=True)


def download_stream(url: str, output_path: Path) -> bool:
    if output_path.exists() and output_path.stat().st_size > 1_000_000:
        log(f"Ya existe ({output_path.stat().st_size // 1_000_000}MB): {output_path.name}", "SKIP")
        return True

    log(f"Descargando -> {output_path.name}")

    cmd = [
        "yt-dlp",
        "--format", "bestvideo+bestaudio/best",
        "--merge-output-format", "mp4",
        "--output", str(output_path),
        "--no-playlist",
        "--progress",
        url,
    ]
    result = subprocess.run(cmd)
    if result.returncode == 0 and output_path.exists() and output_path.stat().st_size > 100_000:
        log(f"OK ({output_path.stat().st_size // 1_000_000}MB)", "OK")
        return True

    if ".m3u8" in url:
        cmd_ff = [
            "ffmpeg", "-y", "-i", url,
            "-c", "copy", "-bsf:a", "aac_adtstoasc",
            str(output_path),
        ]
        result2 = subprocess.run(cmd_ff, capture_output=True)
        if result2.returncode == 0 and output_path.exists() and output_path.stat().st_size > 100_000:
            log(f"OK via ffmpeg ({output_path.stat().st_size // 1_000_000}MB)", "OK")
            return True

    log(f"Fallo: {output_path.name}", "ERROR")
    return False


def main():
    lessons = json.loads(STRUCTURE_FILE.read_text(encoding="utf-8"))
    log(f"RAIO - Descargando {len(lessons)} lecciones", "HEAD")

    dl = sk = fl = 0
    for lesson in lessons:
        num = lesson["num"]
        url = lesson.get("stream_url")
        if not url:
            log(f"[{num:02d}] Sin URL — {lesson['title'][:40]}", "SKIP")
            sk += 1
            continue

        out = VIDEOS_DIR / f"{num:02d}.mp4"
        log(f"[{num:02d}] {lesson['title'][:50]}")
        if download_stream(url, out):
            dl += 1
        else:
            fl += 1

    log(f"Total: {len(lessons)} | Descargados/existentes: {dl} | Sin URL: {sk} | Fallidos: {fl}", "OK")


if __name__ == "__main__":
    main()
