from sqlalchemy import BigInteger, String, JSON, UniqueConstraint, ForeignKey
from sqlalchemy.dialects.mysql import TINYINT
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.models.base import Base, TimestampMixin, TenantMixin


class PluginConfig(Base, TenantMixin, TimestampMixin):
    """插件配置（按租户独立管理）"""

    __tablename__ = "plugin_configs"
    __table_args__ = (
        UniqueConstraint("tenant_id", "plugin_name", name="uk_plugin_tenant_name"),
        {
            "mysql_engine": "InnoDB",
            "mysql_charset": "utf8mb4",
            "mysql_collate": "utf8mb4_unicode_ci",
        },
    )

    id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
    plugin_name: Mapped[str] = mapped_column(String(100), nullable=False, comment="与 /plugins 目录名一致")
    is_active: Mapped[int] = mapped_column(TINYINT(1), nullable=False, default=0, comment="租户是否启用该插件")
    config: Mapped[dict | None] = mapped_column(JSON, nullable=True, comment="插件专属配置（API Key 等）")

    tenant = relationship("Tenant", back_populates="plugin_configs", lazy="noload")

    def get_config(self, key: str, default=None):
        if not self.config:
            return default
        return self.config.get(key, default)

    def __repr__(self) -> str:
        return f"<PluginConfig id={self.id} plugin={self.plugin_name!r} active={bool(self.is_active)}>"
