# ─────────────────────────────────────────────────────────────────────────────
# StudyFlow — requirements MINIMOS para instalación LOCAL-FIRST (Windows / Mac)
#
# NO son los requirements de producción. Ver backend/requirements.txt para el
# conjunto completo del contenedor Docker.
#
# Incluye SOLO lo verificado como necesario para que la app ARRANQUE y
# funcione en local sobre SQLite. Verificado empíricamente el 2026-10-06:
#
#   venv limpio → pip install -r requirements-local.txt
#                → create_app() OK, 181 rutas
#                → /api/health HTTP 200 (engine=sqlite)
#
# Cada dependencia está fijada porque tiene ruedas oficiales para win_amd64.
#
# ── EXCLUIDO A PROPÓSITO, y por qué ────────────────────────────────────────
# gunicorn            El launcher local usa Flask app.run(), no gunicorn.
#                     Además gunicorn NO soporta Windows (solo fork workers).
# psycopg2-binary     database.py lo importe dentro de try/except a propósito;
#                     en modo SQLite no se usa y no hace falta.
# weasyprint          Import diferido en services/md_to_pdf.py. Arrancar en
#                     Windows exigiría pango/cairo, muy difícil de instalar.
#                     Solo afecta a la función MD→PDF.
#                     (SÍ están notebooklm-py y playwright: eran "excluidos" por
#                     considerarse pesados, lo que no era cierto y dejaba el
#                     login de NotebookLM sin implementación posible en
#                     Windows. Ver su entrada al final del fichero.)
# selenium            scorm_import.py y runner.py, que server.py NO importa.
# gevent / gevent-ws  SÍ están: los necesita routes/novnc_proxy.py para el
#                     login embebido de NotebookLM. Ver la nota al final.
# yt-dlp              YouTubeZen; se invoca como binario por subprocess.
# ─────────────────────────────────────────────────────────────────────────────

# Núcleo del servidor
Flask==3.1.1
Flask-Cors==4.0.0
python-dotenv==1.1.0

# Autenticación (bcrypt/cryptography se necesitan entre sí)
PyJWT==2.8.0
bcrypt==4.1.2
cryptography==50.0.2

# Import DURO en routes/calendar.py: sin esto la app no arranca en un
# entorno limpio. Ya estaba declarado en backend/requirements.txt.
icalendar==7.3.0

# Red (calendar / YouTube / providers de IA)
requests==2.34.2
httpx==0.28.1

# PDF e imágenes (importados como "fitz" y "PIL")
PyMuPDF==1.28.2
pillow==12.3.0

# Síntesis de voz
edge-tts==7.2.8

# ── Zona horaria del calendario importado ────────────────────────────────
# routes/calendar.py resuelve Europe/Madrid con zoneinfo. Windows no trae base
# de datos de zonas horarias — no existe /usr/share/zoneinfo — así que sin este
# paquete ZoneInfoNotFoundError y el import de calendario responde 500 con
# "server timezone data missing". Verificado en el equipo del usuario.
#
# En el Mac no hace falta porque el sistema ya lo trae; allí lo que se estaba
# usando era el tzdata de Anaconda, no una dependencia del proyecto. Por eso el
# fallo solo aparece en Windows.
#
# NO BAJAR DE 2025.3: icalendar (arriba) declara tzdata>=2025.3, así que un pin
# menor hace que TODO el install de requirements-local.txt sea irresoluble y el
# launcher se quede con un venv sin flask. tests/test_windows_local_install.py lo
# verifica, porque un "esta en el fichero" no dice nada de si es instalable.
tzdata==2025.3

# ── Login embebido de NotebookLM (noVNC) ────────────────────────────────────
# routes/novnc_proxy.py importa gevent A NIVEL DE MÓDULO. server.py lo envuelve
# en try/except, así que la app arranca igual sin esto — y por eso es una
# trampa: la vista embebida no aparece y no hay ningún error visible, solo una
# ventana que no abre. Son 2 MB y un par de segundos: valen la pena.
#
# Nota: esto solo da el proxy WebSocket. El cliente noVNC además espera los
# estáticos en /opt/novnc, que es una ruta de contenedor y no existe en local.
# En una máquina personal el login embebido seguirá sin funcionar aunque las
# dependencias estén; para eso hace falta el contenedor. Lo que sí arregla es
# que /api/settings/notebooklm/status responda y muestre un error claro en vez
# de comportamiento indefinido.
gevent==25.9.1
gevent-websocket==0.10.1

# ── Login de NotebookLM ──────────────────────────────────────────────────────
# backend/requirements.txt (la fuente canónica) ya los declaraba; aquí estaban
# fuera por una nota que era FALSA: "pesa muchísimo (arrastra Playwright +
# navegadores)". Verificado contra el wheel de 0.8.4 en 2026-10-06:
#
#   * playwright es extra opcional (`browser`), no dependencia base.
#     La base de notebooklm-py es click, filelock, httpx, idna y rich.
#   * pip NO descarga navegadores. Eso es `playwright install`, separado.
#     Por tanto no instalamos nada aquí que pese 150 MB por su cuenta.
#
# El login local usa el Chrome del usuario, no el Chromium de Playwright:
#   notebooklm: `channel = browser if browser != "chromium" else None`
#   → --browser chrome → channel="chrome" → Chrome de sistema.
# Su equipo también soporta --browser msedge. Ningún download de navegador.
#
# 0.8.4 NO es casual: Google migró NotebookLM a https://notebook.google.com y la
# 0.7.2 seguía esperando el host viejo en page.wait_for_url(), por lo que nunca
# detectaba el login ni escribía storage_state.json. Copiado de backend/requirements.txt.
notebooklm-py==0.8.4
playwright==1.63.0
