#!/usr/bin/env python3
"""Construye el indice del curso YouTalkTV a partir de los PDFs de clase.

No hace falta la transcripcion para esto. Los PDFs ya traen el tema escrito:

- Grammar: temas numerados en las paginas 2 en adelante ("1.- In spite of")
- Vocabulary y Sentences: pares espanol -> ingles numerados, listos para Anki

    python indexar.py RAIZ SALIDA.md
"""
import argparse
import os
import re
import sys
from collections import defaultdict

import pymupdf

TEMA = re.compile(r"^\s*(\d{1,2})\s*\.\-\s*(.+?)\s*$", re.M)
CLASE = re.compile(r"Class-(\d+)\.(\d+)-(\w+)", re.I)


def texto(ruta):
    try:
        with pymupdf.open(ruta) as d:
            return "\n".join(p.get_text() for p in d)
    except Exception as exc:
        print(f"  aviso: no se pudo leer {ruta}: {exc}", file=sys.stderr)
        return ""


def temas_grammar(txt):
    """Titulos numerados, sin duplicados y sin los que son solo un numero."""
    vistos, out = set(), []
    for _n, titulo in TEMA.findall(txt):
        t = " ".join(titulo.split())
        if len(t) < 3 or t.lower() in vistos or t[0].isdigit():
            continue
        vistos.add(t.lower())
        out.append(t)
    return out


def cuenta_pares(txt):
    """Numero de items numerados en un PDF de vocabulario o frases."""
    return len(re.findall(r"^\s*\d{1,3}\s*$", txt, re.M))


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("raiz")
    ap.add_argument("salida")
    args = ap.parse_args()

    unidades = defaultdict(lambda: defaultdict(list))  # nivel -> unidad -> clases

    for dp, dns, fns in os.walk(args.raiz):
        dns[:] = [d for d in dns if not d.startswith(".")]
        for fn in sorted(fns):
            if not fn.lower().endswith(".pdf"):
                continue
            m = CLASE.search(fn)
            if not m:
                continue
            if "dudas" in fn.lower():
                continue
            rel = os.path.relpath(os.path.join(dp, fn), args.raiz)
            partes = rel.split(os.sep)
            nivel = partes[0]
            unidad = int(m.group(1))
            clase = f"{m.group(1)}.{m.group(2)}"
            tipo = m.group(3).capitalize()

            txt = texto(os.path.join(dp, fn))
            if tipo == "Grammar":
                detalle = temas_grammar(txt)
                resumen = "; ".join(detalle) if detalle else "(sin temas legibles)"
            else:
                n = cuenta_pares(txt)
                resumen = f"{n} pares es->en" if n else "(vacio)"
            unidades[nivel][unidad].append((clase, tipo, resumen))

    total_clases = sum(len(cs) for u in unidades.values() for cs in u.values())

    with open(args.salida, "w", encoding="utf-8") as f:
        f.write("---\ntags: [ingles, indice, youtalktv]\n"
                "created: 2026-08-21\n---\n\n")
        f.write("# Indice de YouTalkTV Plus\n\n")
        f.write("Sacado de los PDFs de clase con `assets/codes/indexar.py`. "
                "No usa la transcripcion.\n\n")
        f.write(f"{total_clases} clases en {len(unidades)} niveles.\n\n")
        f.write("Las clases rotan en ciclo: **Grammar**, **Sentences**, "
                "**Vocabulary**. Las de Sentences y Vocabulary son pares "
                "espanol-ingles numerados, o sea un mazo de Anki ya hecho.\n")

        for nivel in sorted(unidades):
            f.write(f"\n## {nivel}\n")
            for unidad in sorted(unidades[nivel]):
                f.write(f"\n### Unit {unidad}\n\n")
                f.write("| Clase | Tipo | Contenido |\n|---|---|---|\n")
                for clase, tipo, resumen in sorted(unidades[nivel][unidad]):
                    f.write(f"| {clase} | {tipo} | {resumen} |\n")

    print(f"{total_clases} clases indexadas en {len(unidades)} niveles -> {args.salida}")


if __name__ == "__main__":
    main()
