"""插件助手工具

提供 is_plugin_active() 供各插件端点检查自身是否被租户启用。
"""
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import HTTPException

from app.config import settings


async def is_plugin_active(plugin_name: str, db: AsyncSession, tenant_id: int | None = None) -> bool:
    """
    检查指定插件是否被租户启用。
    - 若 plugin_configs 中无记录（从未设置），按插件 PLUGIN_META.default_active 决定（缺省启用）。
    - 若记录 is_active=0，返回 False。
    """
    tid = tenant_id or settings.DEFAULT_TENANT_ID
    r = await db.execute(
        text(
            "SELECT is_active FROM plugin_configs "
            "WHERE tenant_id=:tid AND plugin_name=:name LIMIT 1"
        ),
        {"tid": tid, "name": plugin_name},
    )
    row = r.fetchone()
    if row is None:
        return _default_active(plugin_name)  # 无记录：按插件默认值
    return bool(row[0])


def _default_active(plugin_name: str) -> bool:
    """读取插件 PLUGIN_META.default_active（缺省 True），加载失败也按启用。"""
    try:
        import importlib
        mod = importlib.import_module(f"app.plugins.{plugin_name}")
        meta = getattr(mod, "PLUGIN_META", None) or {}
        return bool(meta.get("default_active", True))
    except Exception:
        return True


async def require_plugin(plugin_name: str, db: AsyncSession, tenant_id: int | None = None) -> None:
    """
    检查插件是否启用，未启用则抛出 503。
    用法：await require_plugin("wechat_auth", db)
    """
    if not await is_plugin_active(plugin_name, db, tenant_id):
        raise HTTPException(
            status_code=503,
            detail=f"插件「{plugin_name}」未启用，请在插件中心开启后使用。",
        )
