import logging
import os
from pathlib import Path

from ctf_kit_core.log.logging.hybrid_logging_handler import HybridRotatingFileHandler


def get_logger(name):
    """
    获取指定名称的日志记录器实例
    :param name: 日志记录器的名称，通常使用模块名 __name__
    :return: logging.Logger: 配置好的日志记录器实例
    :example: logger = get_logger(__name__)
    """
    return logging.getLogger(name)

def get_default_format():
    """获取默认日志格式字符串
    
    返回一个标准的日志格式模板，包含以下信息：
    
    格式说明：
        %(asctime)s      - 时间戳，格式为 YYYY-MM-DD HH:MM:SS,mmm
        %(name)s         - 日志记录器名称
        %(levelname)s    - 日志级别名称 (DEBUG/INFO/WARNING/ERROR/CRITICAL)
        %(lineno)d       - 调用日志语句的代码行号
        %(filename)s     - 调用日志语句的文件名
        %(thread)d       - 线程ID
        %(threadName)s   - 线程名称
        %(message)s      - 实际的日志消息内容
    
    返回格式示例：
        2026-02-16 14:30:25,123 - my_module - INFO - [Thread-12345:MainThread] - my_file.py:45 - This is a log message
    
    Returns:
        str: 标准化的日志格式字符串
    """
    return '[%(asctime)s - %(levelname)s]: %(name)s|Thread-%(thread)d:%(threadName)s|%(filename)s(%(lineno)d): %(message)s'

def get_file_handler(log_file:str, backup_count:int=30, max_file_size:int=50*1024*1024):
    """
    获取文件处理器
    :param log_file: 日志文件路径
    :param backup_count: 备份数量
    :param max_file_size: 单个文件最大字节数
    :return: logging.FileHandler: 文件处理器
    """
    os.makedirs(os.path.dirname(Path(log_file).absolute()), exist_ok=True)
    return HybridRotatingFileHandler(
        filename=log_file,
        encoding='utf-8',
        when='D',  # 按天轮转
        interval=1,  # 每天轮转一次
        backupCount=backup_count,  # 保留30天的日志
        maxBytes=max_file_size  # 50MB大小限制
    )

def get_console_handler():
    """
    获取控制台处理器
    :return: logging.StreamHandler: 控制台处理器
    """
    return logging.StreamHandler()


if __name__ == '__main__':
    import logging

    log_file = 'logs/app.log'
    logging.basicConfig(level=logging.INFO, format=get_default_format(),
                        handlers=[get_console_handler(), get_file_handler(log_file)])
    logger = get_logger(__name__)
    logger.info('This is a log message')