"""
Servicio de generación de embeddings para consultas RAG.
Llama directamente a OpenAI sin cache.
"""

from typing import List
from langchain_openai import OpenAIEmbeddings
from config.settings import settings
import logging
import time

logger = logging.getLogger(__name__)


class EmbeddingsService:
    """Servicio para generar embeddings de textos."""

    def __init__(self):
        self.embeddings_model = OpenAIEmbeddings(
            model=settings.EMBEDDING_MODEL,
            openai_api_key=settings.OPENAI_API_KEY,
            dimensions=settings.EMBEDDING_DIMENSIONS,
            timeout=30,
        )
        self.dimensions = settings.EMBEDDING_DIMENSIONS

    def _normalize_text(self, text: str) -> str:
        """Normaliza texto para embeddings consistentes."""
        return " ".join(text.lower().strip().split())

    def embed_query(self, query: str) -> List[float]:
        """
        Genera embedding para una consulta llamando directamente a OpenAI.
        """
        try:
            normalized_query = self._normalize_text(query)
            logger.info(f"🔢 [EMBEDDING OpenAI] '{query[:60]}'")
            t0 = time.time()
            embedding = self.embeddings_model.embed_query(normalized_query)
            logger.info(f"⏱️ [EMBEDDING OpenAI] completado en {time.time() - t0:.2f}s")
            return embedding
        except Exception as e:
            logger.error(f"❌ Error generando embedding (query='{query[:60]}'): {e}")
            return []

    def embed_documents(self, documents: List[str]) -> List[List[float]]:
        """
        Genera embeddings para múltiples documentos.
        """
        try:
            normalized_docs = [self._normalize_text(doc) for doc in documents]
            logger.info(f"🔢 Generando embeddings para {len(documents)} documentos")
            return self.embeddings_model.embed_documents(normalized_docs)
        except Exception as e:
            logger.error(f"❌ Error generando embeddings: {e}")
            return []


# Instancia global
embeddings_service = EmbeddingsService()
