from typing import List
from src.Llms.Embedders.Base_Embedder import EmbedderABC  # Asegúrate de que EmbedderABC esté en este módulo
from src.ApiKeys.openai_apikey import OpenAICredencial
from src.ConexionApis.OpenAi_conexion import OpenAICliente
from src.Security.GenerarIDs import GeneradorIDUnico

class OpenAIEmbedder(EmbedderABC):
    def __init__(self, credencial: OpenAICredencial,
                  model: str,
                  id: str = None):
        self.model = model
        self.client = OpenAICliente(credencial)
        self._dimension = None  # Lazy loading
        self.id = id if id is not None else GeneradorIDUnico("OAMB").generar()

    def encoder(self, text: str) -> List[float]:
        """
        Genera los embeddings para un texto dado utilizando el modelo de OpenAI.
        """
        response = self.client.embedding(model=self.model, input=text)
        embedding = response.data[0].embedding
        if self._dimension is None:
            self._dimension = len(embedding)
        return embedding

    def dimension_number(self) -> int:
        """
        Devuelve la dimensión del modelo de embedding, generando un embedding si no se ha calculado aún.
        """
        if self._dimension is None:
            _ = self.encoder("dimension_check")
        return self._dimension