import logging
from langchain_openai import ChatOpenAI
from langchain_core.messages import AIMessage, SystemMessage
from config.settings import settings
from agent.utils.summary_metrics import collect_summary_metrics
from agent.utils.pdf_generator import generate_and_upload_executive_summary

logger = logging.getLogger(__name__)

async def resumen_pdf_skill_node(state):
    """
    Nodo encargado de recolectar métricas y generar el Resumen Ejecutivo en PDF.
    """
    logger.info("⚙️ Skill activada: RESUMEN_EJECUTIVO_PDF")
    
    # 1. Obtener las métricas pre-calculadas de caché con rescate en vivo
    metrics = await collect_summary_metrics(retry_with_live=True)
    
    # 2. Consultas Trimestrales Dinámicas: 3 Meses a la fecha
    quarterly_context = ""
    try:
        from agent.utils.mcp_helper import safe_invoke_tool
        from agent.utils.date_context import get_current_date_context
        import json
        
        ctx = get_current_date_context()
        mes_actual_num = ctx["mes_num"]
        año_actual = ctx["año_actual"]
        
        # Calcular los 3 meses dinámicamente (actual y 2 anteriores)
        meses_trimestre = []
        for i in range(3):
            m = mes_actual_num - i
            a = año_actual
            if m <= 0:
                m += 12
                a -= 1
            meses_trimestre.append({"num": m, "año": a})
            
        # Construir filtro DAX dinámico
        dax_filter = " || ".join([f"('Calendario'[Año] = {it['año']} && 'Calendario'[MesNumero] = {it['num']})" for it in meses_trimestre])
        
        dax_q = (
            f"EVALUATE SUMMARIZECOLUMNS('Calendario'[Mes], 'Calendario'[MesNumero], 'Calendario'[Año], "
            f"FILTER('Calendario', {dax_filter}), "
            f"\"Venta\", [Venta], \"UB\", [Utilidad Bruta]) ORDER BY 'Calendario'[Año] ASC, 'Calendario'[MesNumero] ASC"
        )
        q_res = await safe_invoke_tool("consultarAgrotaUbPresupuesto", {"dax": dax_q})
        
        if q_res and isinstance(q_res, list) and len(q_res) > 0:
            data_q = json.loads(q_res[0].get("text", "{}"))
            results_q = data_q.get("resultados", [])
            for row in results_q:
                mes = row.get("Calendario[Mes]", "MES").upper()
                v_val = row.get("[Venta]", 0)
                ub_val = row.get("[UB]", 0)
                # Inyectar métricas trimestrales dinámicas en la tabla del PDF
                metrics[f"TRIM_{mes}_V"] = {"label": f"Venta {mes.capitalize()}", "valor_texto": f"${v_val:,.2f}"}
                metrics[f"TRIM_{mes}_UB"] = {"label": f"UB {mes.capitalize()}", "valor_texto": f"${ub_val:,.2f}"}
                quarterly_context += f"- {mes}: Venta ${v_val:,.2f}, UB ${ub_val:,.2f}\n"
    except Exception as e:
        logger.error(f"Error cargando datos trimestrales dinámicos: {e}")

    # 3. Resumir la situación general usando IA
    llm = ChatOpenAI(model=settings.MODEL_NAME, temperature=0.3)
    
    contexto_metricas = "KPIs Actuales:\n"
    for k, v in metrics.items():
        if not k.startswith("TRIM_"):
            contexto_metricas += f"- {v['label']}: {v['valor_texto']}\n"
    
    contexto_metricas += f"\nTendencia Trimestral (3 meses a la fecha):\n{quarterly_context}"
        
    prompt_sys = (
        "Eres un experto financiero de Agrota. Redacta una conclusión ejecutiva breve (max 120 palabras) "
        "resumiendo la situación actual y destacando la tendencia de los últimos 3 meses detallados. "
        "Identifica picos de crecimiento o caídas relevantes. "
        "USA TEXTO PLANO. PROHIBIDO USAR ASTERISCOS (**) O MARKDOWN."
    )
    
    res_ai = await llm.ainvoke([
        SystemMessage(content=prompt_sys),
        SystemMessage(content=contexto_metricas)
    ])
    conclusion = res_ai.content.strip()
    
    # 3. Generar y Subir el PDF
    documento_url = None
    try:
        # Restauramos valores por defecto para evitar bloqueos por sesión
        user_name = state.get("user_name", "Tommy Mendoza")
        user_role = state.get("user_role", "Gerente General")
        
        # Limpiar asteriscos (MD) de la conclusión para el PDF
        clean_conclusion = conclusion.replace("**", "")

        documento_url = await generate_and_upload_executive_summary(
            metrics, 
            clean_conclusion, 
            requester_name=user_name, 
            requester_role=user_role
        )
        logger.info(f"✅ PDF generado exitosamente: {documento_url}")
    except Exception as e:
        logger.error(f"Error general en resumen: {e}")
        
    # 4. Actualizar Estado
    pendientes = state.get("intenciones_pendientes", [])
    if "RESUMEN_EJECUTIVO_PDF" in pendientes:
        pendientes.remove("RESUMEN_EJECUTIVO_PDF")
        
    interactive_data = None
    if documento_url:
        interactive_data = {
            "mensaje": "Aquí tienes tu Resumen Ejecutivo consolidado.",
            "documento_url": documento_url,
            "filename": "Resumen_Ejecutivo_Agrota.pdf"
        }
        
    return {
        "interactive_data": interactive_data,
        "intenciones_pendientes": [],
        "mensaje_skill": "PDF Generado",
        "dashboard": "RESUMEN_EJECUTIVO_PDF",
        "intencion": "GENERAL_CHAT"
    }
