from pinecone import Pinecone
from app.configs.settings import settings
from langchain_openai.embeddings import OpenAIEmbeddings
 
class PineconeService:
    
    def __init__(self, sub_hotel_id: str):
        # We will only initialize if API key is provided
        self.sub_hotel_id = sub_hotel_id
        if settings.PINECONE_API_KEY:
            self.pc = Pinecone(api_key=settings.PINECONE_API_KEY)
            self.index_name = "bayview" if sub_hotel_id == "124" else "plazabeach" if sub_hotel_id == "123" else "baypalms" if sub_hotel_id == "125" else None
        else:
            self.pc = None
            self.index_name = None
    
    def get_index(self):
        if not self.pc:
            raise ValueError("Pinecone API key is not configured.")
        return self.pc.Index(self.index_name)

async def retrieve(query: str, sub_hotel_id: str, k: int = 4) -> list:
    """Query Pinecone directly and tolerate vectors missing metadata/content."""
    pinecone_service = PineconeService(sub_hotel_id=sub_hotel_id)
    index = pinecone_service.get_index()
    query_vector = await get_embeddings(query)
    
    results = index.query(
    vector=query_vector,
    top_k=k,
    include_metadata=True,
    include_values=False,
    )
    
    matches = getattr(results, "matches", []) or []
    documents: list = []
    for match in matches:
        metadata = getattr(match, "metadata", None) or {}
        content = metadata.get("content") or metadata.get("text")
        if not content:
            continue

        documents.append(metadata)
    
    return documents

async def get_embeddings(query: str) -> OpenAIEmbeddings:
    if not settings.OPENAI_API_KEY:
        raise ValueError("OpenAI API key is not configured.")
    
    model = OpenAIEmbeddings(
        model="text-embedding-3-small",
        openai_api_key=settings.OPENAI_API_KEY,
        dimensions=512,
    )

    embedding = await model.aembed_query(query)
    return embedding
 