"""
日志配置模块（改进版 v2）

根据环境（开发/生产）和环境变量配置 Django 日志系统

改进内容：
1. ✅ 结构化日志 - JSON 格式便于日志分析和监控
2. ✅ 性能指标日志 - 专门记录性能相关信息
3. ⚠️  异步日志处理 - 需要额外配置（见下方说明）

环境变量：
- LOG_LEVEL: 全局日志级别 (DEBUG/INFO/WARNING/ERROR/CRITICAL)
- LOG_DIR: 日志文件目录（留空则不输出文件）

开发环境特性：
- 默认 DEBUG 级别
- 控制台彩色输出
- 可选文件输出

生产环境特性：
- 默认 INFO 级别
- 控制台 + 文件输出（配置 LOG_DIR）
- 文件自动轮转（10MB，保留5个备份）
- JSON 结构化日志
- 性能指标日志

依赖安装：
- pip install python-json-logger  # JSON 格式化器

异步日志说明：
- 当前使用标准 RotatingFileHandler（同步写入）
- 如需异步处理，可使用 logging_config_new.py 中的 QueueHandler 方案
- 异步方案需要额外的 QueueListener 配置和生命周期管理

设计说明：
- 直接从环境变量读取配置，避免与 settings.py 循环依赖
- settings.py 在加载时会调用此模块，此时 settings 对象尚未完全初始化
- 这是 Django 配置模块的常见模式
"""

import os
from pathlib import Path


def get_logging_config(debug: bool = False):
    """
    获取日志配置字典
    
    Args:
        debug: 是否为 DEBUG 模式
    
    Returns:
        dict: Django LOGGING 配置字典
    """
    # 获取日志配置
    log_level = os.getenv('LOG_LEVEL', 'DEBUG' if debug else 'INFO')
    log_dir = os.getenv('LOG_DIR', '')
    
    # 构建 handlers 配置
    log_handlers = ['console']
    logging_handlers = {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'colored' if debug else 'standard',
            'stream': 'ext://sys.stdout',
        }
    }
    
    # 如果配置了日志目录，添加文件 handler
    if log_dir:
        log_path = Path(log_dir)
        log_path.mkdir(parents=True, exist_ok=True)
        
        # 标准文件日志
        log_handlers.append('file')
        logging_handlers['file'] = {
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'standard',
            'filename': str(log_path / 'xingrin.log'),
            'maxBytes': 100 * 1024 * 1024,  # 100MB
            'backupCount': 5,
            'encoding': 'utf-8',
        }
        
        # 错误日志单独记录
        log_handlers.append('error_file')
        logging_handlers['error_file'] = {
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'standard',
            'filename': str(log_path / 'xingrin_error.log'),
            'maxBytes': 100 * 1024 * 1024,  # 100MB
            'backupCount': 5,
            'encoding': 'utf-8',
            'level': 'ERROR',  # 只记录 ERROR 及以上级别
        }
        
        # JSON 结构化日志（暂时关闭，需要时再开启）
        # log_handlers.append('json_file')
        # logging_handlers['json_file'] = {
        #     'class': 'logging.handlers.RotatingFileHandler',
        #     'formatter': 'json',
        #     'filename': str(log_path / 'xingrin_json.log'),
        #     'maxBytes': 100 * 1024 * 1024,  # 100MB
        #     'backupCount': 5,
        #     'encoding': 'utf-8',
        # }
        
        # 性能指标日志（可读格式，便于人工查看）
        logging_handlers['performance_file'] = {
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'standard',  # 使用可读格式，不用 JSON
            'filename': str(log_path / 'performance.log'),
            'maxBytes': 100 * 1024 * 1024,  # 100MB
            'backupCount': 5,
            'encoding': 'utf-8',
        }
    
    # 构建完整的 LOGGING 配置
    logging_config = {
        'version': 1,
        'disable_existing_loggers': False,
        
        # 格式化器
        'formatters': {
            'standard': {
                'format': '[%(asctime)s] [%(levelname)s] [%(name)s:%(lineno)d] %(message)s',
                'datefmt': '%Y-%m-%d %H:%M:%S',
            },
            'colored': {
                'format': '%(log_color)s[%(asctime)s] [%(levelname)s] [%(name)s:%(lineno)d]%(reset)s %(message)s',
                'datefmt': '%Y-%m-%d %H:%M:%S',
                '()': 'colorlog.ColoredFormatter',
                'log_colors': {
                    'DEBUG': 'cyan',
                    'INFO': 'green',
                    'WARNING': 'yellow',
                    'ERROR': 'red',
                    'CRITICAL': 'red,bg_white',
                },
            },
            # JSON 格式化器（结构化日志）
            'json': {
                '()': 'pythonjsonlogger.jsonlogger.JsonFormatter',
                'format': '%(asctime)s %(name)s %(levelname)s %(message)s %(pathname)s %(lineno)d',
                'datefmt': '%Y-%m-%d %H:%M:%S',
            },
        },
        
        # 处理器
        'handlers': logging_handlers,
        
        # 日志记录器
        'loggers': {
            # Django 核心日志
            'django': {
                'handlers': log_handlers,
                'level': 'INFO',  # Django 框架日志，通常不需要 DEBUG
                'propagate': False,
            },
            'django.request': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 请求错误日志
                'propagate': False,
            },
            'django.server': {
                'handlers': log_handlers,
                'level': 'WARNING',  # Django 开发服务器日志
                'propagate': False,
            },
            'django.db.backends': {
                'handlers': log_handlers,
                'level': 'WARNING' if not debug else 'DEBUG',  # SQL 查询日志（开发环境可启用）
                'propagate': False,
            },
            

            
            # 应用日志 - 扫描模块
            'apps.scan': {
                'handlers': log_handlers,
                'level': log_level,
                'propagate': False,
            },
            
            # 应用日志 - 其他模块（统一级别）
            'apps.asset': {
                'handlers': log_handlers,
                'level': log_level,
                'propagate': False,
            },
            'apps.targets': {
                'handlers': log_handlers,
                'level': log_level,
                'propagate': False,
            },
            'apps.engine': {
                'handlers': log_handlers,
                'level': log_level,
                'propagate': False,
            },
            'apps.common': {
                'handlers': log_handlers,
                'level': log_level,
                'propagate': False,
            },
            
            # 第三方库日志控制
            'websockets': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 WebSocket 的 DEBUG/INFO 日志
                'propagate': False,
            },
            'websockets.client': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 WebSocket 客户端的调试日志
                'propagate': False,
            },
            'httpx': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 HTTP 客户端的详细日志
                'propagate': False,
            },
            'httpcore': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 HTTP 核心库的调试日志
                'propagate': False,
            },
            'httpcore.connection': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 HTTP 连接的调试日志
                'propagate': False,
            },
            'httpcore.http11': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 HTTP/1.1 协议的调试日志
                'propagate': False,
            },
            'prefect': {
                'handlers': log_handlers,
                'level': 'INFO',  # Prefect 框架日志保持 INFO 级别
                'propagate': False,
            },
            'apscheduler': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭定时任务的 INFO 日志（每分钟执行）
                'propagate': False,
            },
            'apscheduler.scheduler': {
                'handlers': log_handlers,
                'level': 'WARNING',
                'propagate': False,
            },
            'apscheduler.executors': {
                'handlers': log_handlers,
                'level': 'WARNING',
                'propagate': False,
            },
            'graphviz': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 graphviz 的 DEBUG 日志
                'propagate': False,
            },
            'graphviz._tools': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 graphviz._tools 的 DEBUG 日志
                'propagate': False,
            },
            
            # Django 框架日志控制
            'django.db.backends': {
                'handlers': log_handlers,
                'level': 'INFO',  # 关闭数据库查询的 DEBUG 日志
                'propagate': False,
            },
            'django.db.backends.schema': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭数据库模式的 DEBUG 日志
                'propagate': False,
            },
            'django.utils.autoreload': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭自动重载的 DEBUG 日志
                'propagate': False,
            },
            'django.request': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 只记录 WARNING 以上的请求日志（错误请求）
                'propagate': False,
            },
            'django.server': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭服务器的 INFO 日志（如访问日志）
                'propagate': False,
            },
            
            # 其他第三方库日志控制
            'asyncio': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 asyncio 的 DEBUG 日志
                'propagate': False,
            },
            'urllib3': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭 urllib3 的详细日志
                'propagate': False,
            },
            'urllib3.connectionpool': {
                'handlers': log_handlers,
                'level': 'WARNING',  # 关闭连接池的详细日志
                'propagate': False,
            },
            
            # 性能指标日志（专门记录性能相关信息）
            'performance': {
                'handlers': ['performance_file'] if log_dir else ['console'],
                'level': 'INFO',
                'propagate': False,
            },
        },
        
        # 根日志记录器（兜底配置）
        'root': {
            'level': log_level,
            'handlers': log_handlers,
        },
    }
    
    return logging_config
