import sys
from pathlib import Path
from typing import TYPE_CHECKING, List, Type

from loguru import logger

if TYPE_CHECKING:
    from loguru import Record


def file_exception_filter(
    record: "Record", 
    ignored_exceptions: tuple[Type[Exception], ...]
) -> bool:
    """
    一个自定义的 Loguru 过滤器函数。
    如果日志记录包含异常信息，并且该异常的类型在 ignored_exceptions 中，则返回 False（忽略）。
    否则，返回 True（允许记录）。
    """
    exception_info = record.get("exception")
    
    if exception_info:
        exception_type = exception_info[0]

        if exception_type and issubclass(exception_type, ignored_exceptions):
            return False

    return True


def init_logger(
    log_dir: Path, 
    ignored_exceptions: List[Type[Exception]]
) -> None:
    """
    配置全局 Loguru Logger。

    Args:
        log_dir (Path): 存放日志文件的文件夹路径，会自动创建。
        ignored_exceptions (List[Type[Exception]]): 在 WARNING 级别文件日志中需要忽略的异常类型列表。
    """

    ignored_exceptions_tuple = tuple(ignored_exceptions)
    logger.remove()

    log_dir.mkdir(parents=True, exist_ok=True)

    logger.add(
        sys.stderr,
        level="INFO",
        colorize=True,
        format="<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
    )

    info_log_path = log_dir / "log.log"
    logger.add(
        str(info_log_path),
        level="INFO",
        rotation="10 MB",
        retention="7 days",
        enqueue=True,
        backtrace=False,
        diagnose=False,
    )

    warning_error_log_path = log_dir / "error.log"
    logger.add(
        str(warning_error_log_path),
        level="WARNING",
        rotation="10 MB",
        compression="zip",
        enqueue=True,
        filter=lambda record: file_exception_filter(record, ignored_exceptions_tuple),
        backtrace=True,
        diagnose=True,
    )

    logger.info("Loguru Logger 初始化完成！")
    logger.info(f"控制台日志级别: INFO")
