import os
import logging
from logging.handlers import RotatingFileHandler
from datetime import datetime

class LoggerManager:
    def __init__(self, log_dir=None, max_log_files=3, log_level=logging.DEBUG):
        """
        Менеджер логирования для prompt-storage.
        
        :param log_dir: Директория для хранения логов. Если None или "", логирование отключается.
        :param max_log_files: Максимальное количество файлов логов.
        :param log_level: Уровень логирования (по умолчанию DEBUG).
        """
        self.log_dir = log_dir
        self.max_log_files = max_log_files
        self.log_level = log_level

        # Создаём логгер
        self.logger = logging.getLogger("prompt_storage_logger")
        self.logger.setLevel(self.log_level)

        if self.log_dir:
            os.makedirs(self.log_dir, exist_ok=True)  # Создаём папку логов
            self._cleanup_old_logs()  # Очищаем старые логи
            self._setup_handlers()  # Добавляем обработчики
        else:
            self.logger.addHandler(logging.NullHandler())  # Отключаем логирование

    def _cleanup_old_logs(self):
        """Удаляет самые старые файлы, если их количество превышает max_log_files."""
        log_files = sorted(
            [os.path.join(self.log_dir, f) for f in os.listdir(self.log_dir) if f.startswith("app_") and f.endswith(".log")],
            key=os.path.getctime
        )

        while len(log_files) > self.max_log_files:
            oldest_file = log_files.pop(0)
            os.remove(oldest_file)
            print(f"🗑 Удален старый лог-файл: {oldest_file}")

    def _setup_handlers(self):
        """Настраивает обработчики логирования."""
        log_format = "%(asctime)s - %(name)s - %(levelname)s - %(module)s.%(funcName)s - %(message)s"

        # Файл логирования с ротацией
        log_filename = os.path.join(self.log_dir, f"app_{datetime.now().strftime('%Y-%m-%d')}.log")
        file_handler = RotatingFileHandler(log_filename, maxBytes=5 * 1024 * 1024, backupCount=self.max_log_files)
        file_handler.setLevel(logging.INFO)
        file_handler.setFormatter(logging.Formatter(log_format))

        # Вывод в консоль (только WARNING и выше)
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.WARNING)
        console_handler.setFormatter(logging.Formatter("%(name)s - %(levelname)s - %(module)s.%(funcName)s - %(message)s"))

        # Добавляем обработчики, если они ещё не добавлены
        if not self.logger.handlers:
            self.logger.addHandler(file_handler)
            self.logger.addHandler(console_handler)

    def get_logger(self):
        """Возвращает настроенный логгер."""
        return self.logger