from fastapi import FastAPI, Form
from openai import BaseModel
from app.filtro_vectores import procesar_colecciones, procesar_colecciones_codigo
from app.actualizacion_productos import actualizar_mulvus
import ast
app = FastAPI()


class RespuestaMilvus(BaseModel):
    contenido: str
    documento: str
    
class ListaCodigos(BaseModel):
    contenido: list


@app.post("/pregunta_milvus_maquinaria")
def envio_pregunta_milvus(pregunta: str = Form(...)):
    colecciones = [
        "Catalogo_Maquinaria",
        "listado_productos",
        "informacion_garantia",
        "piezas_maquinaria",
	"Catalogo_Maquinaria_2025",
	"blog_maquinaria"
    ]
    contenido = ""
    titulos = []
    data = procesar_colecciones(
        colecciones,
        db_name="agrota",
        uri="http://74.208.60.79:19530",
        pregunta=pregunta,
        k=6,
    )
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_ordenados = sorted(docs, key=lambda x: x[1], reverse=True)
    for documento, puntaje in docs_ordenados:
        if puntaje > 0.3:
            contenido += documento.page_content + "\n\n"
            titulos.append(documento.metadata["document"])
    if len(titulos) > 0:
        modelo = RespuestaMilvus(contenido=contenido, documento=titulos[0])
    else:
        modelo = RespuestaMilvus(contenido="", documento="ADICIONAL")
    return modelo


@app.post("/pregunta_milvus_quimicos")
def envio_pregunta_milvus(pregunta: str = Form(...)):
    colecciones = [
        "catalogos_quimicos",
        "listados_quimicos",
        "blog_agricola"
    ]
    contenido = ""
    titulos = []
    data = procesar_colecciones(
        colecciones,
        db_name="agrota",
        uri="http://74.208.60.79:19530",
        pregunta=pregunta,
        k=6,
    )
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_ordenados = sorted(docs, key=lambda x: x[1], reverse=True)
    for documento, puntaje in docs_ordenados:
        if puntaje > 0.3:
            contenido += documento.page_content + "\n\n"
            titulos.append(documento.metadata["document"])
    if len(titulos) > 0:
        modelo = RespuestaMilvus(contenido=contenido, documento=titulos[0])
    else:
        modelo = RespuestaMilvus(contenido="", documento="ADICIONAL")
    return modelo

@app.post("/pregunta_milvus_quimicos_adicional")
def envio_pregunta_milvus(pregunta: str = Form(...)):
    colecciones = [
        "info_quimicos",
    ]
    contenido = ""
    titulos = []
    data = procesar_colecciones(
        colecciones,
        db_name="agrota",
        uri="http://74.208.60.79:19530",
        pregunta=pregunta,
        k=1,
    )
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_ordenados = sorted(docs, key=lambda x: x[1], reverse=True)
    for documento, puntaje in docs_ordenados:
        if puntaje > 0.3:
            contenido += documento.page_content + "\n\n"
            titulos.append(documento.metadata["document"])
    if len(titulos) > 0:
        modelo = RespuestaMilvus(contenido=contenido, documento=titulos[0])
    else:
        modelo = RespuestaMilvus(contenido="", documento="ADICIONAL")
    return modelo


@app.post("/pregunta_milvus_inventario")
def envio_pregunta_milvus(pregunta: str = Form(...),tipo: str = Form(...)):
    colecciones = [
        "SUB_PRODUCTOS_AGROTA_1",
        "SUB_PRODUCTOS_AGROTA_2",
        "SUB_PRODUCTOS_AGROTA_3",
        "SUB_PRODUCTOS_AGROTA_4",
        "SUB_PRODUCTOS_AGROTA_5",
        "SUB_PRODUCTOS_AGROTA_6",
        "SUB_PRODUCTOS_AGROTA_7",
        "SUB_PRODUCTOS_AGROTA_8",
        "SUB_PRODUCTOS_AGROTA_9",
        "SUB_PRODUCTOS_AGROTA_10",
        "SUB_PRODUCTOS_AGROTA_11",
        "SUB_PRODUCTOS_AGROTA_12",
        "SUB_PRODUCTOS_AGROTA_13",
        "SUB_PRODUCTOS_AGROTA_14",
    ]
    codigos = []
    data = procesar_colecciones_codigo(
        colecciones,
        db_name="agrotaInventario",
        uri="http://20.109.7.113:19530",
        pregunta=pregunta,
        k=10,
    )
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_ordenados = sorted(docs, key=lambda x: x[1], reverse=True)
    for documento, puntaje in docs_ordenados:
        if puntaje > 0.0 and ast.literal_eval(documento.page_content).get('division', 'División no encontrada')==tipo:
        #if puntaje > 0.1:
            codigos.append(documento.metadata["code"])
    if len(codigos) > 0:
        modelo = ListaCodigos(contenido=codigos)
        print(modelo)
    else:
        modelo = ListaCodigos(contenido=[])
    return modelo

@app.post("/pregunta_milvus_inventario_adicional")
def envio_pregunta_milvus(pregunta: str = Form(...),tipo: str = Form(...)):
    colecciones = [
        "PRODUCTOS_AGROTA",
    ]
    codigos = []
    data = procesar_colecciones_codigo(
        colecciones,
        db_name="agrotaInventario",
        uri="http://74.208.60.79:19530",
        pregunta=pregunta,
        k=1,
    )
    docs = []
    for sublist in data:
        docs.extend(sublist)
    docs_ordenados = sorted(docs, key=lambda x: x[1], reverse=True)
    for documento, puntaje in docs_ordenados:
        if puntaje > 0.0 and ast.literal_eval(documento.page_content).get('division', 'División no encontrada')==tipo:
        #if puntaje > 0.1:
            codigos.append(documento.metadata["code"])
    if len(codigos) > 0:
        modelo = ListaCodigos(contenido=codigos)
        print(modelo)
    else:
        modelo = ListaCodigos(contenido=[])
    return modelo

@app.post("/actualizar_productos_milvus")
def actualizar_productos_milvus(collectionName: str = Form(...)):
    print("actualizar_productos_milvus")
    return actualizar_mulvus.actualizar_productos(collectionName)