import logging
import json
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from config.settings import settings
from agent.utils.mcp_helper import safe_invoke_tool

logger = logging.getLogger(__name__)

async def historico_skill_node(state):
    """
    Nodo especializado en consultar datos históricos consolidados desde la DB (vía MCP Tool).
    """
    prompt_usuario = state["messages"][-1].content
    
    llm = ChatOpenAI(model=settings.MODEL_NAME, temperature=0)
    
    # 1. Extraer Mes y Año de la consulta usando el LLM
    sys_prompt = (
        "Extrae el MES (en minúsculas, ej: 'enero') y el AÑO (ej: 2024) de la consulta del usuario. "
        "Responde ÚNICAMENTE en JSON con los campos 'mes' y 'anio'."
    )
    
    try:
        extraction = await llm.ainvoke([
            SystemMessage(content=sys_prompt),
            HumanMessage(content=prompt_usuario)
        ])
        
        data = json.loads(extraction.content.strip())
        mes = data.get("mes")
        anio = data.get("anio")
        
        if not mes or not anio:
             return {
                "messages": [AIMessage(content="Para darte datos históricos, necesito que me indiques el mes y el año específicos.")],
                "intenciones_pendientes": []
            }
            
        logger.info(f"📊 Consultando histórico para {mes} {anio}")
        
        # 2. Invocar la nueva Tool MCP
        args = {"mes": mes, "anio": int(anio)}
        resultado = await safe_invoke_tool("consultarHistoricoAgrota", args)
        
        # 3. Validar si obtuvimos resultados reales
        pendientes = state.get("intenciones_pendientes", [])
        if "HISTORICO_METRICAS" in pendientes:
            pendientes.remove("HISTORICO_METRICAS")

        # FALLBACK: Si no hay datos históricos consolidados en DB, ir a consulta en VIVO
        is_error = isinstance(resultado, list) and len(resultado) > 0 and "No se encontraron" in str(resultado[0])
        if is_error or not resultado:
            logger.info(f"⚠️ Histórico no encontrado en DB para {mes} {anio}. Activando fallback a consulta en VIVO (Ventas).")
            # Agregamos UB_PRESUPUESTO al inicio de la cola para que el router lo ejecute ahora
            if "UB_PRESUPUESTO" not in pendientes:
                pendientes.insert(0, "UB_PRESUPUESTO")
            
            return {
                "intenciones_pendientes": pendientes,
                "mensaje_skill": f"Buscando datos en vivo para {mes} {anio}..."
            }
            
        return {
            "resultados_tecnicos": [json.dumps(resultado, ensure_ascii=False)],
            "intenciones_pendientes": pendientes,
            "mensaje_skill": f"Datos históricos de {mes} {anio} obtenidos de DB",
            "dashboard": "HISTORICO_METRICAS"
        }
        
    except Exception as e:
        logger.error(f"❌ Error en historico_skill: {e}")
        pendientes = state.get("intenciones_pendientes", [])
        if "HISTORICO_METRICAS" in pendientes:
            pendientes.remove("HISTORICO_METRICAS")
        return {
            "intenciones_pendientes": pendientes,
            "messages": [AIMessage(content="Ocurrió un error al consultar el histórico. Por favor, asegúrate de indicar el mes y año correctamente.")]
        }
