"""Configuración centralizada de logging para el proyecto.

Provee `configure_logging(verbose: bool = False)` que crea una carpeta
`logs/` y subcarpetas por tipo de módulo (infra, usecases, cli) y añade
handlers rotativos para cada tipo. También deja un handler de consola.
"""
from __future__ import annotations

import logging
import logging.handlers
import os
from typing import Optional


def _ensure_dir(path: str) -> None:
    try:
        os.makedirs(path, exist_ok=True)
    except Exception:
        # si no podemos crear logs no rompemos la ejecución
        pass


def configure_logging(verbose: bool = False, base_logs_dir: Optional[str] = None) -> None:
    """Configura logging del proyecto.

    Args:
        verbose: si True activa nivel DEBUG, sino INFO.
        base_logs_dir: directorio raíz para logs (por defecto ./logs).
    """
    level = logging.DEBUG if verbose else logging.INFO

    if base_logs_dir is None:
        base_logs_dir = os.path.join(os.getcwd(), "logs")

    infra_dir = os.path.join(base_logs_dir, "infra")
    usecases_dir = os.path.join(base_logs_dir, "usecases")
    cli_dir = os.path.join(base_logs_dir, "cli")

    _ensure_dir(infra_dir)
    _ensure_dir(usecases_dir)
    _ensure_dir(cli_dir)

    # Formato simple
    fmt = logging.Formatter("%(asctime)s %(levelname)s [%(name)s] %(message)s")

    # Console handler (root)
    console = logging.StreamHandler()
    console.setLevel(level)
    console.setFormatter(fmt)

    # File handlers rotativos por tipo
    infra_fh = logging.handlers.RotatingFileHandler(
        os.path.join(infra_dir, "infra.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8"
    )
    infra_fh.setLevel(logging.DEBUG)
    infra_fh.setFormatter(fmt)

    usecases_fh = logging.handlers.RotatingFileHandler(
        os.path.join(usecases_dir, "usecases.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8"
    )
    usecases_fh.setLevel(logging.DEBUG)
    usecases_fh.setFormatter(fmt)

    cli_fh = logging.handlers.RotatingFileHandler(
        os.path.join(cli_dir, "cli.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8"
    )
    cli_fh.setLevel(logging.DEBUG)
    cli_fh.setFormatter(fmt)

    root = logging.getLogger()
    # limpiar handlers previos para evitar duplicados si se llama varias veces
    for h in list(root.handlers):
        root.removeHandler(h)

    root.setLevel(level)
    root.addHandler(console)

    # Asignar handlers a sub-loggers por prefijo
    logging.getLogger("whisper_project.infra").addHandler(infra_fh)
    logging.getLogger("whisper_project.usecases").addHandler(usecases_fh)
    logging.getLogger("whisper_project.cli").addHandler(cli_fh)
