from abc import ABC, abstractmethod
from dataclasses import dataclass

from fastapi import APIRouter

from common_logging import get_logger

logger = get_logger(__name__)


@dataclass
class PluginMetadata:
    name: str
    version: str
    display_name: str
    description: str
    backend_routes_prefix: str
    dependencies: list[str] = None
    frontend_entry: str | None = None

    def __post_init__(self):
        if self.dependencies is None:
            self.dependencies = []

class IPlugin(ABC):

    @abstractmethod
    def get_metadata(self) -> PluginMetadata:
        pass

    @abstractmethod
    def get_router(self) -> APIRouter:
        pass

    def on_enable(self, tenant_id: int) -> None:
        logger.bind(plugin=self.get_metadata().name, tenant_id=tenant_id).info("Plugin lifecycle: enabled")

    def on_disable(self, tenant_id: int) -> None:
        logger.bind(plugin=self.get_metadata().name, tenant_id=tenant_id).info("Plugin lifecycle: disabled")
