import logging
from agent.utils.precalc_helper import get_cached_result

logger = logging.getLogger("summary-metrics")

# Claves sincronizadas con lhia_precalc_config y optimizadas para reporte ejecutivo
KPI_KEYS = {
    "VENTAS_TOTALES_MES": "Ventas Totales del Mes",
    "VENTAS_UTILIDAD_BRUTA_MES": "Utilidad Bruta Mes",
    "VENTAS_MARGEN_ACTUAL": "Margen de Rentabilidad",
    "VENTAS_CRECIMIENTO_MOM": "Crecimiento vs Mes Anterior",
    "CARTERA_SALDO_TOTAL_ACTUAL": "Saldo Total Cartera",
    "AUTO_DAME_LA_CARTERA_VENCIDA": "Cartera Vencida", # Arquetipo correcto según DB
    "AUTO_DAME_EL_RCC": "RCC (Días de Rotación)",
    "AUTO_DAME_EL_PESO_DEL_ROL_SOBRE_UB": "Peso del Rol sobre UB",
    "VENTAS_UTILIDAD_BRUTA_MAQUINARIA": "UB Maquinaria",
    "VENTAS_UTILIDAD_BRUTA_AGROQUIMICOS": "UB Agroquímicos"
}

async def collect_summary_metrics(retry_with_live: bool = False) -> dict:
    """Extrae las métricas detectando el mes más reciente con datos reales (Smart Date Context)"""
    from agent.utils.mcp_helper import safe_invoke_tool
    from agent.utils.date_context import get_current_date_context
    import json
    
    # 1. Intentar detectar el mes más reciente con Utilidad Bruta
    ctx = get_current_date_context()
    año = ctx["año_actual"]
    mes_actual = ctx["mes_actual"] # abril
    mes_anterior = ctx["mes_anterior"] # marzo
    
    # Validamos si ABRIL ya tiene datos significativos
    check_ub = await safe_invoke_tool("consultarAgrotaUbPresupuesto", {
        "dax": f"EVALUATE ROW(\"Val\", CALCULATE([Utilidad Bruta], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_actual}\"))"
    })
    
    ub_detectada = 0
    try:
        if isinstance(check_ub, list) and len(check_ub) > 0:
            data = json.loads(check_ub[0].get("text", "{}"))
            res_ub = data.get("resultados", [{}])[0]
            ub_detectada = float(list(res_ub.values())[0]) if res_ub else 0
    except:
        ub_detectada = 0

    # Mes de reporte (abril si hay datos, marzo si no)
    mes_reporte = mes_actual if ub_detectada > 1000 else mes_anterior
    # EL PESO DEL ROL siempre se compara con el mes cerrado (Marzo) si estamos en inicio de mes
    mes_rol = mes_anterior # Forzamos marzo para nómina según solicitud
    mes_previo_reporte = mes_anterior if mes_reporte == mes_actual else "febrero"
    
    logger.info(f"📊 Reporte: {mes_reporte.upper()} | Nómina/Rol: {mes_rol.upper()}")

    metrics = {}
    for key, label in KPI_KEYS.items():
        res = await get_cached_result(key)
        
        valor_limpio = "N/D"
        valor_numerico_raw = 0.0
        success = False
        
        # 🔥 RESCATE EN VIVO CON LÓGICA DE FALLBACK HISTÓRICO
        if not success and retry_with_live:
            fallback_map = {
                "CARTERA_SALDO_TOTAL_ACTUAL": ("consultarAgrota", "EVALUATE ROW(\"Val\", [Cartera Total])"),
                "AUTO_DAME_LA_CARTERA_VENCIDA": ("consultarAgrota", "EVALUATE ROW(\"Cartera Vencida\", [Total Vencido])"), # Exact User DAX
                "VENTAS_TOTALES_MES": ("consultarAgrotaUbPresupuesto", f"EVALUATE ROW(\"Val\", CALCULATE([Venta], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_reporte}\"))"),
                "VENTAS_UTILIDAD_BRUTA_MES": ("consultarAgrotaUbPresupuesto", f"EVALUATE ROW(\"UB\", CALCULATE([Utilidad Bruta], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_reporte}\"))"),
                "VENTAS_MARGEN_ACTUAL": ("consultarAgrotaUbPresupuesto", f"EVALUATE ROW(\"Val\", CALCULATE([Margen%], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_reporte}\"))"),
                "VENTAS_CRECIMIENTO_MOM": ("consultarAgrotaUbPresupuesto", f"EVALUATE ROW(\"Val\", DIVIDE(CALCULATE([Venta], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_reporte}\") - CALCULATE([Venta], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_previo_reporte}\"), CALCULATE([Venta], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_previo_reporte}\")))"),
                "AUTO_DAME_EL_RCC": ("consultarAgrota", "EVALUATE ROW(\"Val\", ROUND(DIVIDE([Cartera Total] * 365, [Ventas 365 Dias], 0), 0))"),
                "AUTO_DAME_EL_PESO_DEL_ROL_SOBRE_UB": ("consultarAgrotaTalentoHumano", f"EVALUATE ROW(\"Val\", CALCULATE([%PesoEmpleado/UB-historico], 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_rol.upper()}\"))"),
                "VENTAS_UTILIDAD_BRUTA_MAQUINARIA": ("consultarAgrotaUbPresupuesto", f"EVALUATE ROW(\"Val\", CALCULATE([Utilidad Bruta], MarcaLineaCategoria[Linea] IN {{\"AGROFORESTAL\", \"AGROPECUARIA\", \"HOGAR Y JARDIN\", \"MOVILIDAD\", \"POST-VENTA\"}}, 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_reporte}\"))"),
                "VENTAS_UTILIDAD_BRUTA_AGROQUIMICOS": ("consultarAgrotaUbPresupuesto", f"EVALUATE ROW(\"Val\", CALCULATE([Utilidad Bruta], MarcaLineaCategoria[Linea] IN {{\"NUTRICIONAL\", \"PLAGUICIDAS CONVENCIONALES\"}}, 'Calendario'[Año] = {año}, 'Calendario'[Mes] = \"{mes_reporte}\"))")
            }
            
            mapping = fallback_map.get(key)
            if mapping:
                tool_name, dax = mapping
                live_res = await safe_invoke_tool(tool_name, {"dax": dax})
                
                try:
                    import json
                    if isinstance(live_res, list) and len(live_res) > 0:
                        raw_content = live_res[0].get("text", "")
                        if raw_content:
                            data_mcp = json.loads(raw_content)
                            resultados = data_mcp.get("resultados", [])
                            
                            if resultados and resultados[0]:
                                # Buscamos la primera entrada que tenga un valor no nulo
                                val = list(resultados[0].values())[0]
                                if val is not None:
                                    num = float(val)
                                    valor_numerico_raw = num
                                    if "PESO" in key or "MARGEN" in key or "CRECIMIENTO" in key:
                                        # Si el valor viene como ratio (0.37), lo escalamos a porcentaje (37.97)
                                        val_percent = num * 100 if abs(num) <= 1.0 else num
                                        valor_limpio = f"{val_percent:,.2f}%"
                                    elif "RCC" in key:
                                        valor_limpio = f"{int(num)}"
                                    else:
                                        valor_limpio = f"${num:,.2f}"
                                    success = True
                except Exception as e:
                    logger.error(f"Error procesando live fallback para {key}: {e}")
                    
        metrics[key] = {
            "label": label,
            "valor_texto": valor_limpio,
            "valor_raw": valor_numerico_raw
        }
    return metrics
