#!/usr/bin/env python3
"""Busca si un PDF ya trae el audioscript impreso, para no transcribir de mas.

Reporta por PDF: paginas, si tiene capa de texto, y en que paginas aparecen
las palabras clave tipico de un apendice de transcripciones.

    python buscar-scripts.py CARPETA
"""
import argparse
import os
import re
import sys

CLAVES = [
    "audioscript", "audio script", "audioscripts",
    "tapescript", "tape script",
    "listening script", "video script", "videoscript",
    "transcript",
]
PATRON = re.compile("|".join(re.escape(k) for k in CLAVES), re.IGNORECASE)


def analizar(ruta):
    import pymupdf as fitz

    doc = fitz.open(ruta)
    n = doc.page_count
    chars = 0
    hits = {}
    for i, page in enumerate(doc, 1):
        texto = page.get_text()
        chars += len(texto)
        for m in set(x.lower() for x in PATRON.findall(texto)):
            hits.setdefault(m, []).append(i)
    doc.close()
    return n, chars, hits


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("carpeta")
    ap.add_argument("--cola", type=float, default=0.25,
                    help="fraccion final del PDF que cuenta como apendice")
    args = ap.parse_args()

    pdfs = []
    for dirpath, _d, files in os.walk(args.carpeta):
        for fn in sorted(files):
            if fn.lower().endswith(".pdf"):
                pdfs.append(os.path.join(dirpath, fn))

    print(f"{len(pdfs)} PDFs\n")
    for ruta in pdfs:
        rel = os.path.relpath(ruta, args.carpeta)
        try:
            n, chars, hits = analizar(ruta)
        except Exception as exc:
            print(f"{rel}\n  FALLO: {exc}\n", file=sys.stderr)
            continue

        capa = "sin capa de texto (escaneado)" if chars < n * 50 else f"{chars} chars"
        print(f"{rel}")
        print(f"  {n} pag., {capa}")

        if not hits:
            print("  sin rastro de audioscript\n")
            continue

        corte = n * (1 - args.cola)
        for clave, pags in sorted(hits.items()):
            apendice = [p for p in pags if p >= corte]
            marca = f"  <-- APENDICE, pag {apendice[0]}-{apendice[-1]}" if len(apendice) >= 3 else ""
            muestra = pags[:6]
            extra = f" (+{len(pags) - 6})" if len(pags) > 6 else ""
            print(f"  '{clave}' en {len(pags)} pag: {muestra}{extra}{marca}")
        print()


if __name__ == "__main__":
    main()
