from importlib.metadata import entry_points
import logging
from typing import Any

from pydantic import BaseModel

from oidc_test.models import User

logger = logging.getLogger("registry")


class ProcessResult(BaseModel):
    result: dict[str, Any] = {}


class ProcessError(Exception):
    pass


class ResourceProvider(BaseModel):
    scope_required: str | None = None
    default_resource_id: str | None = None

    def __init__(self, name: str):
        super().__init__()
        self.__name__ = name

    async def process(self, user: User, resource_id: str | None = None) -> ProcessResult:
        logger.warning(f"{self.__name__} should define a process method")
        return ProcessResult()


class ResourceRegistry(BaseModel):
    resource_providers: dict[str, ResourceProvider] = {}

    def make_registry(self):
        for ep in entry_points().select(group="oidc_test.resource_provider"):
            ResourceProviderClass = ep.load()
            if issubclass(ResourceProviderClass, ResourceProvider):
                self.resource_providers[ep.name] = ResourceProviderClass(ep.name)


registry = ResourceRegistry()