import os
import logging
from django.conf import settings

# 获取当前模块的日志记录器，用于输出插件加载过程中的日志信息（如成功或失败记录）
logger = logging.getLogger(__name__)

#wwc
def load_plugins():
    """
    动态加载并初始化插件。

    功能说明：
    该函数用于在 Django 项目启动时，自动发现并加载配置在 `settings.ACTIVE_PLUGINS` 中的插件。
    它会检查每个插件是否存在于指定的插件目录中，并确认其包含入口文件 `plugin.py`。
    如果条件满足，则导入该插件模块，从而执行其内部的初始化代码（如注册信号、钩子、视图、中间件等）。

    调用时机：
    通常在 Django 的 `AppConfig.ready()` 方法中调用此函数，以确保 Django 的应用注册系统已完全就绪，
    避免因过早导入而导致的依赖问题或模型未加载异常。

    执行逻辑：
    1. 遍历 settings 中定义的活跃插件列表（ACTIVE_PLUGINS）。
    2. 对每个插件，构造其在文件系统中的路径。
    3. 判断该路径是否为一个目录，且包含名为 'plugin.py' 的文件（插件入口）。
    4. 若满足条件，则使用 __import__ 动态导入该模块。
    5. 成功导入后记录一条 info 级别的日志；若导入失败，则捕获 ImportError 异常并记录错误日志。

    注意事项：
    - 此函数不返回任何值，也不对插件进行实例化，仅通过导入模块来触发其副作用（如注册行为）。
    - 插件必须遵循目录结构规范：`plugins/<插件名>/plugin.py`。
    - 错误日志中包含异常堆栈（exc_info=True），便于调试和排查插件加载失败原因。
    """
    # 遍历 settings 中配置的已激活插件名称列表
    for plugin_name in settings.ACTIVE_PLUGINS:
        # 构建当前插件的完整文件路径
        plugin_path = os.path.join(settings.PLUGINS_DIR, plugin_name)
        # 检查该插件路径是否为有效目录，且包含 plugin.py 入口文件
        if os.path.isdir(plugin_path) and os.path.exists(os.path.join(plugin_path, 'plugin.py')):
            try:
                # 动态导入插件模块，触发其初始化逻辑
                __import__(f'plugins.{plugin_name}.plugin')
                # 记录插件加载成功的日志
                logger.info(f"Successfully loaded plugin: {plugin_name}")
            except ImportError as e:
                # 记录插件加载失败的错误日志，并包含完整的异常堆栈信息
                logger.error(f"Failed to import plugin: {plugin_name}", exc_info=e)