from langchain_openai import ChatOpenAI
from langchain_core.prompts.chat import PromptTemplate
from langchain_community.vectorstores import Milvus
from langchain_openai import OpenAIEmbeddings
from app.models import modelo_vector
from dotenv import load_dotenv
from connection.connection import milvus_busqueda
from connection.connection import procesar_colecciones
import os
load_dotenv()

def question_milvusr(question:str,collection:str,amount:int):
    contenido=""
    titulos=[]
    docs=vectors_name(question,collection,amount)
    for documento, puntaje in docs:
        if puntaje>0.1:
            contenido+=documento.page_content+"\n\n"
            titulos.append(documento.metadata["document"])
    if len(titulos)>0:
        print(titulos)
        modelo = modelo_vector.RespuestaPgVector(contenido=contenido,documento=titulos[0])
    else:
        modelo = modelo_vector.RespuestaPgVector(contenido="",documento="ADICIONAL")
    return modelo

def vectors_name(question: str,collection: str,amount:int):
    colecciones = [collection]
    for coleccion in colecciones:
        coleccion_docs = milvus_busqueda(coleccion).similarity_search_with_score(question, k=amount)
        puntajes = []  # Inicializamos puntajes antes del bucle
        for documento, puntaje in coleccion_docs:
            puntajes.append(puntaje)
        if puntajes:  # Verificamos que puntajes no esté vacío
            promedio = sum(puntajes) / len(puntajes)
            if promedio > 0.55:
                return coleccion_docs
    
    return milvus_busqueda(collection).similarity_search_with_score(question, k=amount)


def pregunta_milvusr(pregunta: str):
    colecciones = [
        "manuales_y_codigos",
    ]
    contenido = ""
    titulos = []
    data = procesar_colecciones(colecciones, pregunta)
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_ordenados = sorted(docs, key=lambda x: x[1], reverse=True)
    print(docs_ordenados)
    for documento, puntaje in docs_ordenados:
        if puntaje > 0.4:
            contenido += documento.page_content + "\n\n"
            titulos.append(documento.metadata["document"])
    if len(titulos) > 0:
        modelo = modelo_vector.RespuestaPgVector(
            contenido=contenido, documento=titulos[0]
        )
    else:
        modelo = modelo_vector.RespuestaPgVector(contenido="", documento="ADICIONAL")
    print(modelo)
    return modelo