from loguru import logger
import sys
import os
from pathlib import Path


class AppLogger:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(AppLogger, cls).__new__(cls)
            cls._instance.__initialized = False
        return cls._instance

    def __init__(self, app_name: str = "security-scanner", log_dir: str = "/home/lodqa/attack_module_data/logs"):
        if self.__initialized:
            return
        self.__initialized = True

        self.app_name = app_name
        self.log_dir = Path(log_dir)

        # Создаем директорию для логов
        self.log_dir.mkdir(parents=True, exist_ok=True)

        # Основной файл логов
        self.main_log_file = self.log_dir / f"{app_name}.log"

        # Уровень логирования по умолчанию
        log_level = os.getenv("LOG_LEVEL", "INFO")

        # Удаляем стандартный обработчик
        logger.remove()

        # Конфигурация логгера
        self.configure_logger(log_level)

    def configure_logger(self, level: str = "INFO"):
        """Настройка логгера"""
        # Формат сообщений
        log_format = (
            "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
            "<level>{level: <8}</level> | "
            "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
            "<level>{message}</level>"
        )

        # Консольный вывод (с цветами)
        logger.add(
            sys.stdout,
            level=level,
            format=log_format,
            colorize=True,
            backtrace=True,
            diagnose=True
        )

        # Файловый вывод (ротация по размеру и времени)
        logger.add(
            str(self.main_log_file),
            level=level,
            format=log_format,
            rotation="10 MB",
            retention="30 days",
            compression="zip",
            backtrace=True,
            diagnose=True
        )

        # Дополнительные настройки
        logger.configure(extra={"name": "root"})

        # Перехват стандартного логирования
        logger.catch()

    def get_logger(self, name: str = None) -> "Logger":
        """Получение логгера для модуля"""
        return logger.bind(name=name or "root")


# Глобальный экземпляр логгера
app_logger = AppLogger()
get_logger = app_logger.get_logger