# Constantes ##########################################################################

PROMPT = "Busca en Wikipedia información sobre la inflación en Argentina y dame un resumen."


# Librerias de Agno ################################################################

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.yfinance import YFinanceTools
from agno.tools.wikipedia import WikipediaTools

# Prefect imports ##################################################################

from prefect import task, flow
from prefect.logging import get_run_logger
from prefect.filesystems import LocalFileSystem

local_file_system_block = LocalFileSystem.load("localfile")

# Cargar variables de entorno ######################################################

import os
from dotenv import load_dotenv

load_dotenv()

openai_api_key = os.getenv("OPENAI_API_KEY")


# Imports adicionales #########################################################

import traceback
from uuid import uuid4




# 01. Averiguar el prompt que se envía a OpenAI ################################################


@task(name="averiguar_el_prompt_que_seenvia_a_openai", log_prints=True)
def averiguar_el_prompt_que_seenvia_a_openai(prompt_de_usuario: str):
    prefect_logger = get_run_logger()

    try:
        prefect_logger.debug("Creando el agente con OpenAI")

        agente = Agent(
            model=OpenAIChat(id="gpt-4o-mini", api_key=openai_api_key),
            name="analista_financiero",
            description="Agente especializado en análisis financiero y económico",
            debug_mode=True,
            tools=[YFinanceTools(), WikipediaTools()],
        )

        prefect_logger.debug("Preparando los mensajes que se enviarán al modelo...")

        try:
            # 🚀 Este método interno construye los mensajes igual que antes,
            # pero no requiere crear un RunOutput ni AgentSession manualmente.
            run_messages = agente._get_run_messages(
                run_response=None,
                input=prompt_de_usuario,
                session=None,
                session_state={},
                user_id=None,
                audio=None,
                images=None,
                videos=None,
                files=None,
                knowledge_filters=None,
                add_history_to_context=False,
                dependencies=None,
                add_dependencies_to_context=False,
                add_session_state_to_context=False,
                metadata=None,
            )
        except Exception as e:
            prefect_logger.error("❌ Error al generar los mensajes con _get_run_messages()")
            prefect_logger.error(f"Tipo de error: {type(e).__name__}")
            prefect_logger.error(f"Detalle: {str(e)}")
            prefect_logger.error(traceback.format_exc())
            raise

        mensajes_enviados = []
        try:
            for msg in run_messages.messages:
                mensajes_enviados.append({
                    "role": msg.role,
                    "content": msg.content
                })
        except Exception as e:
            prefect_logger.error("❌ Error al procesar los mensajes construidos.")
            prefect_logger.error(f"Tipo de error: {type(e).__name__}")
            prefect_logger.error(f"Detalle: {str(e)}")
            prefect_logger.error(traceback.format_exc())
            raise

        prefect_logger.info("✅ Mensajes construidos por el agente:")
        for m in mensajes_enviados:
            prefect_logger.info(f"ROLE: {m['role']}\nCONTENT:\n{m['content']}\n{'-'*40}")

        resultado = agente.run(prompt_de_usuario)

        prefect_logger.info("✅ Resultado de la ejecución:")
        prefect_logger.info(f"{resultado}")

        prefect_logger.debug("Función completada correctamente ✅")

        return mensajes_enviados

    except Exception as e:
        prefect_logger.error("💥 Error inesperado en la tarea averiguar_el_prompt_que_seenvia_a_openai")
        prefect_logger.error(f"Tipo de error: {type(e).__name__}")
        prefect_logger.error(f"Mensaje: {str(e)}")
        prefect_logger.error(traceback.format_exc())
        raise



# Definir el flujo principal #########################################

@flow(name="Flujo financiero", result_storage=local_file_system_block, log_prints=True)  # type: ignore
def flujo_principal():

    resultado_analisis = averiguar_el_prompt_que_seenvia_a_openai.submit(PROMPT).result()

    return resultado_analisis


# Ejecutar el flujo principal #############################


if __name__ == "__main__":
    flujo_principal()