# app/xulcan/system/registry.py

from typing import TypeVar, Generic, Type, Dict

# 'T' es el comodín mágico. Puede ser LLMProvider, LedgerRepository, StateStore, etc.
T = TypeVar('T')

class ProviderRegistry(Generic[T]):
    """
    Registro Universal (Fábrica Abstracta) para Xulcan.
    Almacena Clases (Type[T]), no instancias. Permite Lazy Loading y Validación Dinámica.
    """
    def __init__(self, component_name: str = "Componente"):
        self._component_name = component_name
        self._providers: Dict[str, Type[T]] = {}

    def register(self, name: str, provider_class: Type[T]) -> None:
        """Registra la Clase del adaptador (Ej: GeminiAdapter, InMemoryLedger)."""
        self._providers[name] = provider_class

    def get_class(self, name: str) -> Type[T]:
        """Devuelve la Clase lista para ser instanciada."""
        if name not in self._providers:
            raise ValueError(f"{self._component_name} '{name}' no encontrado. ¿Olvidaste registrarlo?")
        return self._providers[name]
    
    @property
    def available_providers(self) -> list[str]:
        return list(self._providers.keys())