from typing import Dict, Type
from src.core.providers.base import BasePaymentProvider


class ProviderRegistry:
    _providers: Dict[str, Type[BasePaymentProvider]] = {}

    @classmethod
    def register(cls, provider_class: Type[BasePaymentProvider]) -> Type[BasePaymentProvider]:
        instance = provider_class()
        cls._providers[instance.slug] = provider_class
        return provider_class

    @classmethod
    def get(cls, slug: str) -> BasePaymentProvider:
        klass = cls._providers.get(slug)
        if not klass:
            raise ValueError(f"No payment provider registered for slug '{slug}'")
        return klass()

    @classmethod
    def all_slugs(cls) -> list:
        return list(cls._providers.keys())

    @classmethod
    def is_registered(cls, slug: str) -> bool:
        return slug in cls._providers
