"""Logger JSON pour le service audioin."""

import json
import logging
import sys
from datetime import datetime
from pathlib import Path
from typing import Any, Dict


class JSONFormatter(logging.Formatter):
    """Formatteur JSON pour les logs."""

    def format(self, record: logging.LogRecord) -> str:
        """Formate un record en JSON."""
        log_entry = {
            "timestamp": datetime.utcnow().isoformat() + "Z",
            "level": record.levelname,
            "module": record.name,
            "message": record.getMessage(),
        }

        # Ajouter les champs extra
        if hasattr(record, "rms_avg"):
            log_entry["rms_avg"] = record.rms_avg
        if hasattr(record, "active_ratio"):
            log_entry["active_ratio"] = record.active_ratio
        if hasattr(record, "vad_state"):
            log_entry["vad_state"] = record.vad_state
        if hasattr(record, "config"):
            log_entry["config"] = record.config

        # Exception info si présente
        if record.exc_info:
            log_entry["exception"] = self.formatException(record.exc_info)

        return json.dumps(log_entry, ensure_ascii=False)


def setup_logger(log_file: str = "/opt/Skull/logs/audioin.log") -> logging.Logger:
    """Configure le logger JSON."""
    logger = logging.getLogger("audioin")
    logger.setLevel(logging.INFO)

    # Éviter les doublons si déjà configuré
    if logger.handlers:
        return logger

    # Handler fichier
    log_path = Path(log_file)
    log_path.parent.mkdir(parents=True, exist_ok=True)

    file_handler = logging.FileHandler(log_file)
    file_handler.setLevel(logging.INFO)
    file_handler.setFormatter(JSONFormatter())

    # Handler console pour debug
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(logging.DEBUG)
    console_formatter = logging.Formatter(
        "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    )
    console_handler.setFormatter(console_formatter)

    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger


def log_rms_stats(logger: logging.Logger, rms_avg: float, active_ratio: float) -> None:
    """Log des statistiques RMS."""
    logger.info(
        "Statistiques RMS", extra={"rms_avg": rms_avg, "active_ratio": active_ratio}
    )


def log_vad_state_change(logger: logging.Logger, new_state: str, rms: float) -> None:
    """Log changement d'état VAD."""
    logger.info(
        f"VAD état changé: {new_state}", extra={"vad_state": new_state, "rms": rms}
    )


def log_config_update(logger: logging.Logger, config: Dict[str, Any]) -> None:
    """Log mise à jour configuration."""
    logger.info("Configuration VAD mise à jour", extra={"config": config})
