"""Logger configuré pour le service voice."""

import logging
import logging.handlers
import json
import time
from typing import Dict, Any
from .config import VoiceConfig


class JSONFormatter(logging.Formatter):
    """Formatter JSON pour les logs."""

    def format(self, record: logging.LogRecord) -> str:
        """Formate le log en JSON."""
        log_data = {
            "timestamp": time.time(),
            "level": record.levelname,
            "module": record.name,
            "message": record.getMessage(),
        }

        # Ajouter des champs supplémentaires si disponibles
        if hasattr(record, "extra_data"):
            log_data.update(record.extra_data)

        return json.dumps(log_data, ensure_ascii=False)


def setup_logger(name: str) -> logging.Logger:
    """Configure et retourne un logger."""
    logger = logging.getLogger(name)

    if logger.handlers:
        return logger

    logger.setLevel(getattr(logging, VoiceConfig.LOG_LEVEL))

    # Handler fichier avec rotation
    file_handler = logging.handlers.RotatingFileHandler(
        VoiceConfig.get_log_file(), maxBytes=10 * 1024 * 1024, backupCount=5  # 10MB
    )
    file_handler.setFormatter(JSONFormatter())

    # Handler console pour développement
    console_handler = logging.StreamHandler()
    console_formatter = logging.Formatter(VoiceConfig.LOG_FORMAT)
    console_handler.setFormatter(console_formatter)

    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger


def log_with_metrics(logger: logging.Logger, level: str, message: str, **kwargs):
    """Log avec métriques supplémentaires."""
    extra_record = logging.LogRecord(
        name=logger.name,
        level=getattr(logging, level.upper()),
        pathname="",
        lineno=0,
        msg=message,
        args=(),
        exc_info=None,
    )
    extra_record.extra_data = kwargs
    logger.handle(extra_record)
