import openai
from fastapi import APIRouter, Depends, HTTPException
from fastapi import Request
from app.queries.facturacion_queries import obtener_facturacion_por_ano
from app.database.session import get_db

from sqlalchemy.orm import Session

router = APIRouter()

# Configura tu clave API de OpenAI
openai.api_key = "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"

@router.get("/analizar_facturacion_llm")
def analizar_facturacion_llm(db=Depends(get_db)):
    try:
        # Paso 1: Obtener los datos de facturación desde la base de datos
        facturacion_data = obtener_facturacion_por_ano(db)

        # Paso 2: Preparar el JSON para enviarlo al LLM
        prompt = f"""
        Dado el siguiente conjunto de datos de facturación: {facturacion_data}

        Por favor, responde las siguientes preguntas:
        1. ¿Cuál fue el mes con mayor facturación y cuánto se facturó?
        2. ¿Cuál es el promedio de facturación mensual?
        3. Genera un informe comparativo de los meses.
        """

        # Paso 3: Enviar el JSON al LLM y obtener la respuesta
        response = openai.ChatCompletion.create(
            model="gpt-4",  # Puedes usar "gpt-3.5-turbo" o "gpt-4"
            messages=[
                {"role": "system", "content": "Eres un asistente que analiza datos de facturación."},
                {"role": "user", "content": prompt}
            ],
            max_tokens=300,
            temperature=0.7
        )
        respuesta = response.choices[0].message['content']

        # Paso 4: Devolver la respuesta del LLM al usuario
        return {"respuesta": respuesta}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error al procesar los datos con LLM: {e}")
    
@router.post("/enviar_prompt")
async def enviar_prompt(request: Request):
    try:
        # Leer el cuerpo de la solicitud como JSON
        data = await request.json()
        prompt = data.get("prompt")

        # Verificar si el prompt fue enviado
        if not prompt:
            raise HTTPException(status_code=400, detail="El campo 'prompt' es obligatorio")

        # Enviar el prompt al modelo LLM
        response = openai.ChatCompletion.create(
            model="gpt-4",  # Puedes usar "gpt-3.5-turbo" o "gpt-4"
            messages=[
                {"role": "system", "content": "Eres un asistente avanzado que responde preguntas y analiza datos."},
                {"role": "user", "content": prompt}
            ],
            max_tokens=300,
            temperature=0.7
        )
        respuesta = response.choices[0].message['content']

        # Devolver la respuesta del LLM
        return {"respuesta": respuesta}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error al procesar el prompt: {e}")

@router.post("/analizar_facturacion_kpi2")
async def analizar_facturacion_kpi(request: Request, db=Depends(get_db)):
    try:
        # Leer el cuerpo de la solicitud como JSON
        data = await request.json()
        user_input = data.get("input")

        if not user_input:
            raise HTTPException(status_code=400, detail="El campo 'input' es obligatorio")

        # Obtener los datos de facturación desde la base de datos
        facturacion_data = obtener_facturacion_por_ano(db)

        # Convertir el JSON de facturación en un formato legible
        datos_facturacion = "\n".join(
            [f"Mes: {mes}, Facturación: {total}" for registro in facturacion_data for mes, total in registro.items()]
        )

        # Crear el prompt combinando la entrada del usuario con los datos de facturación
        prompt = f"""
        Basado en los siguientes datos de facturación:
        {datos_facturacion}

        {user_input}

        Proporciona una respuesta detallada considerando los datos de facturación proporcionados.
        """

        # Enviar el prompt al modelo de OpenAI
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": "Eres un asistente experto en análisis de datos financieros."},
                {"role": "user", "content": prompt}
            ],
            max_tokens=500,
            temperature=0.7
        )
        respuesta = response.choices[0].message['content']

        return {"respuesta": respuesta}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error al procesar los datos con LLM: {e}")

@router.post("/analizar_kpi")
async def analizar_kpi(request: Request, db: Session = Depends(get_db)):
    try:
        # Leer datos de la solicitud
        data = await request.json()
        user_input = data.get("input")  # Entrada del usuario
        historial = data.get("historial", [])  # Historial de mensajes

        if not user_input:
            raise HTTPException(status_code=400, detail="El campo 'input' es obligatorio")

        # Mostrar menú inicial si el historial está vacío
        if len(historial) == 0:
            respuesta = """
            Bienvenido al asistente de análisis. Por favor, selecciona una opción:
            1. Facturación.
            2. Cirugía.
            3. Consulta Externa.
            Escribe el número de la opción que deseas elegir.
            """
            return {"respuesta": respuesta, "es_menu": True}

        # Manejar opción 1 (Facturación)
        if user_input == "1":
            # Obtener datos de facturación desde la base de datos
            facturacion_data = obtener_facturacion_por_ano(db)
            if not facturacion_data:
                return {"respuesta": "No se encontraron datos de facturación.", "es_menu": False}

            # Formatear los datos de facturación con las columnas `sum` y `fecha`
            datos_facturacion = "\n".join(
                [f"Fecha: {registro['fecha']}, Total Facturado: {registro['sum']}" for registro in facturacion_data]
            )

            # Incluir los datos de facturación en el historial como mensaje del sistema
            historial.append({
                "role": "system",
                "content": f"Los siguientes son los datos de facturación:\n{datos_facturacion}"
            })

            # Respuesta inicial para el usuario
            respuesta = f"""
            Los datos de facturación han sido cargados. A continuación se muestran los totales:
            {datos_facturacion}
            
            Ahora puedes hacer preguntas específicas sobre estos datos. ¿Cómo puedo ayudarte?
            """
            return {"respuesta": respuesta, "historial": historial, "es_menu": False}

        # Si ya se cargaron los datos o el usuario hace una pregunta
        if any(h["content"].startswith("Los siguientes son los datos de facturación") for h in historial if h["role"] == "system"):
            # Generar mensaje para GPT basado en el historial
            mensajes = [
                {"role": "system", "content": "Eres un asistente experto en análisis de datos financieros."}
            ]
            mensajes.extend(historial)  # Agregar historial completo
            mensajes.append({"role": "user", "content": user_input})  # Añadir la consulta del usuario

            # Llamar al modelo GPT para obtener la respuesta
            response = openai.ChatCompletion.create(
                model="gpt-4",
                messages=mensajes,
                max_tokens=500,
                temperature=0.7
            )
            respuesta_gpt = response.choices[0].message['content']

            # Añadir la respuesta al historial
            historial.append({"role": "assistant", "content": respuesta_gpt})

            # Responder al usuario con la respuesta generada
            return {"respuesta": respuesta_gpt, "historial": historial, "es_menu": False}

        # Manejar opciones no válidas
        respuesta = """
        Opción no válida. Por favor, selecciona una opción del menú:
        1. Facturación.
        2. Cirugía.
        3. Consulta Externa.
        """
        return {"respuesta": respuesta, "es_menu": True}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Error al procesar la solicitud: {e}")