#!/usr/bin/env python3
"""
Descarga boletines oficiales de San Juan.

Formato del nombre de archivo (2023+):
    (05)_(MAYO)_14-05-2026__(P._32_Internet.pdf

El script prueba múltiplos de 4 en el número de páginas hasta dar con el correcto.

Uso:
    python descargar_sanjuan.py                              # Descarga el boletín del día actual
    python descargar_sanjuan.py --anio 2025 --mes 4          # Descarga todo abril de 2025
    python descargar_sanjuan.py --anio 2025 --mes 4 --dia 1  # Descarga el 01/04/2025
    python descargar_sanjuan.py --anio 2025                  # Descarga todo el año 2025
"""

import datetime
import logging
import os
import sys
from pathlib import Path

import requests

sys.path.insert(0, str(Path(__file__).resolve().parent))
from base import BaseDescargador

BASE_URL = "http://contenido.sanjuan.gob.ar/media/k2/attachments"

MESES = {
    1: "ENERO", 2: "FEBRERO", 3: "MARZO", 4: "ABRIL",
    5: "MAYO", 6: "JUNIO", 7: "JULIO", 8: "AGOSTO",
    9: "SEPTIEMBRE", 10: "OCTUBRE", 11: "NOVIEMBRE", 12: "DICIEMBRE",
}

SESSION = requests.Session()
SESSION.headers.update({"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"})

_ROOT = Path(__file__).resolve().parent.parent.parent.parent
_DIRECTORIO_DEFAULT = str(_ROOT / "files" / "boletines" / "san_juan" / "sin_procesar")


class DescargadorSanJuan(BaseDescargador):
    NOMBRE = "SAN JUAN"
    DIRECTORIO = _DIRECTORIO_DEFAULT

    def nombre_archivo(self, fecha: datetime.date) -> str:
        return f"SAN_JUAN_{fecha.strftime('%Y_%m_%d')}.pdf"

    def descargar_fecha(self, fecha: datetime.date, directorio: str) -> bool:
        anio       = fecha.year
        mes_num    = f"{fecha.month:02d}"
        mes_nombre = MESES[fecha.month]
        anio_2d    = f"{anio % 100:02d}"
        fecha_4d   = fecha.strftime("%d-%m-%Y")
        fecha_2d   = fecha.strftime(f"%d-%m-{anio_2d}")

        if anio >= 2023:
            candidatos = [
                f"({mes_num})_({mes_nombre})_{fecha_4d}__(P._{{p}}_Internet.pdf",
            ]
        elif anio == 2022:
            candidatos = [
                f"({mes_num})__({mes_nombre})_{fecha_2d}__(P._{{p}}_Internet.pdf",   # doble __ después de fecha
                f"({mes_num})__({mes_nombre})_{fecha_2d}_(P._{{p}}_Internet.pdf",    # simple _ después de fecha
                f"({mes_nombre})_{fecha_2d}_(P._{{p}}_Internet.pdf",                 # sin número de mes
                f"({mes_nombre})_{fecha_2d}__(P._{{p}}_Internet.pdf",                # sin número de mes + __
            ]
        else:
            # 2021 y anteriores
            candidatos = [
                f"({mes_num})__({mes_nombre})_{fecha_2d}_(P._{{p}}___Internet.pdf",  # triple ___
                f"({mes_num})__({mes_nombre})_{fecha_2d}_(P._{{p}}_Internet.pdf",    # simple _
                f"({mes_num})__({mes_nombre})_{fecha_2d}_(P._{{p}}__Internet.pdf",   # doble __
                f"({mes_num})__({mes_nombre})_{fecha_2d}__(P._{{p}}_Internet.pdf",   # __ después de fecha
            ]

        for paginas in range(4, 300, 4):
            for plantilla in candidatos:
                nombre = plantilla.format(p=paginas)
                url    = f"{BASE_URL}/{nombre}"
                try:
                    r = SESSION.head(url, timeout=8, allow_redirects=True)
                    if r.status_code != 200:
                        continue

                    logging.info(f"  Encontrado: {nombre}")
                    r_pdf = SESSION.get(url, timeout=120, stream=True)
                    r_pdf.raise_for_status()

                    ruta_destino = os.path.join(directorio, self.nombre_archivo(fecha))
                    with open(ruta_destino, "wb") as f:
                        for chunk in r_pdf.iter_content(chunk_size=8192):
                            f.write(chunk)

                    size_mb = os.path.getsize(ruta_destino) / 1024 / 1024
                    logging.info(f"  Guardado: {ruta_destino} ({size_mb:.1f} MB)")
                    return 'ok'

                except requests.RequestException:
                    continue

        logging.info(f"  No encontrado: {fecha.strftime('%d/%m/%Y')}")
        return 'no_disponible'


if __name__ == "__main__":
    DescargadorSanJuan().run()
