
from ..core.plugin_interface import IPlugin

from common_logging import get_logger

logger = get_logger(__name__)


class PluginRegistry:

    def __init__(self):
        self.plugins: dict[str, IPlugin] = {}
        self.tenant_plugins: dict[int, set[str]] = {}

    def register(self, plugin: IPlugin):
        metadata = plugin.get_metadata()
        self.plugins[metadata.name] = plugin
        logger.bind(plugin_name=metadata.name).info("Plugin registered")

    def get_plugin(self, name: str) -> IPlugin:
        return self.plugins.get(name)

    def list_plugins(self):
        return [p.get_metadata() for p in self.plugins.values()]

    def enable_for_tenant(self, tenant_id: int, plugin_name: str):
        plugin = self.get_plugin(plugin_name)
        if not plugin:
            raise ValueError(f'Plugin {plugin_name} not found')
        if tenant_id not in self.tenant_plugins:
            self.tenant_plugins[tenant_id] = set()
        self.tenant_plugins[tenant_id].add(plugin_name)
        plugin.on_enable(tenant_id)
        logger.bind(plugin_name=plugin_name, tenant_id=tenant_id).info("Plugin enabled for tenant")

    def disable_for_tenant(self, tenant_id: int, plugin_name: str):
        plugin = self.get_plugin(plugin_name)
        if plugin and tenant_id in self.tenant_plugins:
            self.tenant_plugins[tenant_id].discard(plugin_name)
            plugin.on_disable(tenant_id)
            logger.bind(plugin_name=plugin_name, tenant_id=tenant_id).info("Plugin disabled for tenant")

    def get_tenant_plugins(self, tenant_id: int) -> set[str]:
        return self.tenant_plugins.get(tenant_id, set())
plugin_registry = PluginRegistry()
