"""Configuration centralisée des logs (API, CLI, GUI)."""

from __future__ import annotations

import logging
import os
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional

DEFAULT_LOG_DIR = Path(
    os.getenv("WS_LOG_DIR", Path.home() / ".web-sentinel" / "logs")
)
_ROOT_CONFIGURED = False


def _ensure_root_logger(level: int = logging.INFO, app_name: str = "web-sentinel") -> None:
    """Configure le logger racine une seule fois (avec console + fichier)."""
    global _ROOT_CONFIGURED
    if _ROOT_CONFIGURED:
        return

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

    root_logger = logging.getLogger()
    root_logger.setLevel(level)

    # Handler console (stdout)
    if not any(isinstance(h, logging.StreamHandler) for h in root_logger.handlers):
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(level)
        console_handler.setFormatter(formatter)
        root_logger.addHandler(console_handler)

    # Handler fichier avec rotation (si autorisé par l'environnement)
    try:
        DEFAULT_LOG_DIR.mkdir(parents=True, exist_ok=True)
        file_handler = RotatingFileHandler(
            DEFAULT_LOG_DIR / f"{app_name}.log",
            maxBytes=10 * 1024 * 1024,
            backupCount=5,
            encoding="utf-8",
        )
        file_handler.setLevel(level)
        file_handler.setFormatter(formatter)
        root_logger.addHandler(file_handler)
    except OSError:
        # Dans un build PyInstaller portable sans droit d'écriture, on continue sans fichier
        pass

    _ROOT_CONFIGURED = True


def setup_logging(app_name: str = "web-sentinel-api", log_level: str = "INFO"):
    """Configure explicitement le système de logging et retourne un logger nommé."""
    level = getattr(logging, log_level.upper(), logging.INFO)
    _ensure_root_logger(level, app_name)
    return logging.getLogger(app_name)


def get_logger(name: Optional[str] = None, log_level: str = "INFO") -> logging.Logger:
    """Renvoie un logger prêt à l'emploi (utilisé largement dans la GUI)."""
    level = getattr(logging, log_level.upper(), logging.INFO)
    _ensure_root_logger(level)
    return logging.getLogger(name or "web-sentinel")
