"""
Renkli konsol çıktısı ve özelleştirilebilir log filtreleme
"""

import logging
from datetime import datetime

# ANSI renk kodları
RESET = "\033[0m"
RED = "\033[91m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
BLUE = "\033[94m"
MAGENTA = "\033[95m"
CYAN = "\033[96m"


class ExcludeClientPyFilter(logging.Filter):
    """
    Belirli dosya isimlerinden gelen logları filtreler.

    Varsayılan olarak _client.py dosyasından gelen logları engeller.
    """

    def __init__(self, exclude_files=None):
        """
        Args:
            exclude_files (list): Filtrelenecek dosya isimleri listesi.
                                  Varsayılan: ["_client.py"]
        """
        super().__init__()
        self.exclude_files = exclude_files or ["_client.py"]

    def filter(self, record):
        """Log kaydını filtrele"""
        return record.filename not in self.exclude_files


class ColorFormatter(logging.Formatter):
    """
    Renkli konsol çıktısı için özel formatter.

    Her log seviyesi farklı renkle gösterilir:
    - DEBUG: Cyan
    - INFO: Green
    - WARNING: Yellow
    - ERROR: Red
    - CRITICAL: Magenta
    """

    COLORS = {
        'DEBUG': CYAN,
        'INFO': GREEN,
        'WARNING': YELLOW,
        'ERROR': RED,
        'CRITICAL': MAGENTA
    }

    def format(self, record):
        """Log kaydını renkli formatta döndür"""
        color = self.COLORS.get(record.levelname, RESET)

        # Zaman damgası
        timestamp = datetime.fromtimestamp(record.created).strftime("%Y-%m-%d %H:%M:%S")

        # Sabit genişlikte alanlar
        level = f"{record.levelname:<8}"  # 8 karakter genişlik
        filename = f"{record.filename:<35}"  # 35 karakter genişlik
        lineno = f"{record.lineno:<5}"  # 5 karakter genişlik

        message = record.getMessage()

        # Formatlanmış satır
        line = (
            f"{timestamp} | "
            f"{level} | "
            f"{filename} | "
            f"{lineno} | "
            f"{message}"
        )

        return f"{color}{line}{RESET}"


# Varsayılan logger kurulumu
def setup_logger(
        level=logging.INFO,
        exclude_files=None,
        use_color=True,
        stream=None
):
    """
    Özelleştirilmiş logger oluştur.

    Args:
        level: Log seviyesi (varsayılan: logging.INFO)
        exclude_files: Filtrelenecek dosya isimleri listesi
        use_color: Renkli çıktı kullan (varsayılan: True)
        stream: Log çıktısı için stream (varsayılan: sys.stderr)

    Returns:
        logging.Logger: Yapılandırılmış logger

    Örnek:
        >>> from colorlg import setup_logger
        >>> logger = setup_logger(level=logging.DEBUG)
        >>> logger.info("Test mesajı")
    """
    handler = logging.StreamHandler(stream)

    if use_color:
        handler.setFormatter(ColorFormatter())
    else:
        fmt = "%(asctime)s | %(levelname)-8s | %(filename)-35s | %(lineno)-5d | %(message)s"
        handler.setFormatter(logging.Formatter(fmt))

    if exclude_files:
        handler.addFilter(ExcludeClientPyFilter(exclude_files))
    else:
        handler.addFilter(ExcludeClientPyFilter())

    logger = logging.getLogger("colorlg")
    logger.setLevel(level)
    logger.addHandler(handler)
    logger.propagate = False

    return logger


# Varsayılan global logger
logger = setup_logger()