"""
Configuración centralizada de logging para la aplicación.

Genera dos archivos en logs/:
  - app.log      → todos los niveles (INFO+), rotado por tamaño (10 MB, 5 backups)
  - errors.log   → solo ERROR y CRITICAL, rotado por tamaño (5 MB, 3 backups)

Ambos handlers también escriben a stdout (StreamHandler).
"""
import logging
import logging.handlers
from pathlib import Path

# Carpeta de logs en la raíz del proyecto
_LOGS_DIR = Path(__file__).parent.parent / "logs"


def setup_logging(log_level: str = "INFO") -> None:
    """
    Configura el sistema de logging global.
    Debe llamarse una sola vez al arrancar la aplicación.

    Args:
        log_level: Nivel mínimo de logging ("DEBUG", "INFO", "WARNING", "ERROR")
    """
    _LOGS_DIR.mkdir(exist_ok=True)

    numeric_level = getattr(logging, log_level.upper(), logging.INFO)

    formatter = logging.Formatter(
        fmt="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )

    # ── Handler: consola ────────────────────────────────────────────────────
    console_handler = logging.StreamHandler()
    console_handler.setLevel(numeric_level)
    console_handler.setFormatter(formatter)

    # ── Handler: app.log (todos los mensajes INFO+) ─────────────────────────
    app_handler = logging.handlers.RotatingFileHandler(
        filename=_LOGS_DIR / "app.log",
        maxBytes=10 * 1024 * 1024,  # 10 MB
        backupCount=5,
        encoding="utf-8",
    )
    app_handler.setLevel(numeric_level)
    app_handler.setFormatter(formatter)

    # ── Handler: errors.log (solo ERROR y CRITICAL) ─────────────────────────
    error_handler = logging.handlers.RotatingFileHandler(
        filename=_LOGS_DIR / "errors.log",
        maxBytes=5 * 1024 * 1024,  # 5 MB
        backupCount=3,
        encoding="utf-8",
    )
    error_handler.setLevel(logging.ERROR)
    error_handler.setFormatter(formatter)

    # ── Logger raíz ─────────────────────────────────────────────────────────
    root_logger = logging.getLogger()
    root_logger.setLevel(numeric_level)

    # Evitar duplicar handlers si setup_logging se llama más de una vez
    if not root_logger.handlers:
        root_logger.addHandler(console_handler)
        root_logger.addHandler(app_handler)
        root_logger.addHandler(error_handler)

    # Silenciar loggers ruidosos de terceros
    logging.getLogger("neo4j.notifications").setLevel(logging.ERROR)
    logging.getLogger("httpx").setLevel(logging.WARNING)
    logging.getLogger("httpcore").setLevel(logging.WARNING)
    logging.getLogger("openai").setLevel(logging.WARNING)
    logging.getLogger("watchfiles").setLevel(logging.WARNING)
