from langchain.tools import BaseTool
from typing import Any

class PineconeSearchTool(BaseTool):
    vector_store: Any
    embeddings: Any
    name: str = "pinecone_search"
    description: str = "Cuando te pregunten sobre disputas o carteras de clientes, usa esta herramienta."

    class Config:
        arbitrary_types_allowed = True

    def run(self, query: str, **kwargs):
        print(f"Consulta enviada a Pinecone: {query}")

        # Genera el vector de la consulta usando las embeddings
        vector = self.embeddings.embed_query(query)
        print(f"Vector de la consulta: {vector}")

        # Realiza la consulta a Pinecone usando el vector
        response = self.vector_store.query(
            vector=vector,
            filter={"id_cliente": {"$eq": 245}},  # Asegúrate de que el tipo de dato coincida con el valor en Pinecone
            top_k=3,
            include_metadata=True
        )
        print(f"Resultados recibidos de Pinecone: {response}")

        if not response['matches']:
            return "No se encontraron resultados."

        formatted_results = []
        for match in response['matches']:
            metadata = match.get('metadata', {})
            formatted_result = (
                f"ID de Cliente: {metadata.get('id_cliente', 'N/A')}\n"
                f"Nombre Cliente: {metadata.get('nombre_cliente', 'N/A')}\n"
                f"Apellido Cliente: {metadata.get('apellido_cliente', 'N/A')}\n"
                f"Estado Cliente: {metadata.get('estado_Cliente', 'N/A')}\n"
                f"Estado de Pago: {metadata.get('estado_pago', 'N/A')}\n"
                f"Estatus: {metadata.get('estatus', 'N/A')}\n"
                f"Fecha de Pago: {metadata.get('fecha_pago', 'N/A')}\n"
                f"Valor a Depositar: {metadata.get('valor_a_depositar', 'N/A')}\n"
                f"Nombre del Agente de Cobro: {metadata.get('nombre_agente_cobra', 'N/A')}\n"
            )
            formatted_results.append(formatted_result)
        
        # Imprimir todos los vectores y metadatos
        for match in response['matches']:
            print(f"ID: {match.get('id', 'N/A')}")
            print(f"Score: {match.get('score', 'N/A')}")
            print(f"Values: {match.get('values', 'N/A')}")
            print(f"Metadata: {match.get('metadata', 'N/A')}")

        return "\n\n".join(formatted_results)

    async def _arun(self, query: str, **kwargs):
        return self.run(query)

    def _run(self, query: str, **kwargs):
        return self.run(query)
