from app.constants import COLLECTIONS_CATEGORIES, STATUS_SERVER_PRODUCTS,STATUS_SERVER_PRODUCTS_UPDATING,COLLECTIONS_CATEGORIES_BACKUP
from app.models import modelo_vector
from app.langchain_lhia.funciones_langchain.filtro_vectores import vectores, vectors_name, procesar_colecciones
from app.db_mongo.list_collection import find_all,find_status_server_product
import json
import ast

def pregunta_milvusr(pregunta:str):
    contenido=""
    titulos=[]
    docs=vectores(pregunta)
    for documento, puntaje in docs:
        if puntaje>0.5:
            contenido+=documento.page_content+"\n\n"
            titulos.append(documento.metadata["namespace"])
    if len(titulos)>0:
        modelo = modelo_vector.RespuestaPgVector(contenido=contenido,documento=titulos[0])
    else:
        modelo = modelo_vector.RespuestaPgVector(contenido="",documento="ADICIONAL")
    return modelo


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.5:
            contenido+=documento.page_content+"\n\n"
            titulos.append(documento.metadata["namespace"])
    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 process_json(documento):
    try:
        dict_obj = ast.literal_eval(documento.page_content)
        json_obj = json.dumps(dict_obj, ensure_ascii=False)
        json_simple = json_obj.replace("'", "")
        json_simple2 = json_simple.replace('"', "'")
        return json_simple2
    except (ValueError, SyntaxError):
        return documento.page_content
    

def question_milvusr_v2(question:str, amount:int):
    status_server = STATUS_SERVER_PRODUCTS_UPDATING
    dataStatusServer = find_status_server_product(STATUS_SERVER_PRODUCTS)
    if dataStatusServer:
        status_server = dataStatusServer['status']


    if status_server == STATUS_SERVER_PRODUCTS_UPDATING:
        categories = find_all(COLLECTIONS_CATEGORIES_BACKUP)
    else:
        categories = find_all(COLLECTIONS_CATEGORIES)


    colecciones = [str(category["_id"]) for category in categories]
    contenido = ""
    titulos = []
    data = procesar_colecciones(colecciones, question, amount)
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_order = sorted(docs, key=lambda x: x[1], reverse=True)
    for documento, puntaje in docs_order:
        if puntaje > 0.4:
            contenido += process_json(documento) + "\n\n"
            titulos.append(documento.metadata["namespace"])
    if len(titulos)>0:
        modelo = modelo_vector.RespuestaPgVector(contenido=contenido,documento=titulos[0])
    else:
        modelo = modelo_vector.RespuestaPgVector(contenido="",documento="ADICIONAL")
    return modelo




