import os
import requests

# ---------------------------------------------------------
# ZONA DE HARDCODEO (Solo para pruebas)
# Reemplaza los valores con los que te dio Meta Developers
# ---------------------------------------------------------
TEMP_TOKEN = "EAAJQtL9RkeoBQ2pS5i5hGm0wdLXbiQmeZCYUA3fbz0wvZB6DmkGZC8y0Nu4RzYauyCmFsSQ3XRjZCQybyuiZCJj5YrbnvgjDHTmyJMKoQTQmfp9mYip6ZCmUZAWz4US9fBOBIjop5Kdh2VBSTkBtIjuDUVMBJ0laQiNEpenmYO2INiEDZAZCbypcI5nggOy1n7fYM9qzCsnF6liCnwhZAZCA3PQES1FZAjD6M0JEeDUFZAmeZBadPrwuL4Wja8sJQ8ZBPaIliQZAFTXR3sK8EBqOEXCkV8diPOZApdxzjB6Xw6AZDZD"
TEMP_PHONE_ID = "971683732703562"
# ---------------------------------------------------------

def v18_enviar_alerta_whatsapp(numero_destino, nombre_plantilla, header_vars=None, body_vars=None):
    """
    Envía una plantilla de WhatsApp soportando variables con nombre (Key-Value).
    """
    # token = os.environ.get("WHATSAPP_TOKEN_TEST", TEMP_TOKEN)
    # phone_id = os.environ.get("PHONE_NUMBER_ID_TEST", TEMP_PHONE_ID)
    token = TEMP_TOKEN
    phone_id = TEMP_PHONE_ID
    version = "v18.0"

    url = f"https://graph.facebook.com/{version}/{phone_id}/messages"
    
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    }
    
    components = []
    
    # 1. Variables del Encabezado (Header) - Si las hubiera
    if header_vars:
        h_params = [{"type": "text", "parameter_name": key, "text": str(val)} for key, val in header_vars.items()]
        components.append({
            "type": "header",
            "parameters": h_params
        })
        
    # 2. Variables del Cuerpo (Body) - AQUÍ ESTÁ LA MAGIA QUE FALTABA
    if body_vars:
        b_params = [{"type": "text", "parameter_name": key, "text": str(val)} for key, val in body_vars.items()]
        components.append({
            "type": "body",
            "parameters": b_params
        })

    payload = {
        "messaging_product": "whatsapp",
        "to": numero_destino,
        "type": "template",
        "template": {
            "name": nombre_plantilla,
            "language": {
                # IMPORTANTE: Ajustado a "es_CL" para coincidir con tu plantilla aprobada
                "code": "es_CL" if nombre_plantilla != "hello_world" else "en_US"
            }
        }
    }
    
    # Solo agregamos components si la plantilla no es hello_world
    if components and nombre_plantilla != "hello_world":
        payload["template"]["components"] = components
    
    try:
        response = requests.post(url, headers=headers, json=payload, timeout=10)
        response.raise_for_status() 
        return {"status": "success", "data": response.json()}
    except requests.exceptions.RequestException as e:
        error_details = response.text if 'response' in locals() and response else str(e)
        print(f" Error WhatsApp: {error_details}")
        return {"status": "error", "message": str(e), "details": error_details}

def enviar_alerta_whatsapp(numero_destino, nombre_plantilla, header_vars=None, body_vars=None):
    """
    Envía una plantilla de WhatsApp manejando automáticamente la lógica entre
    la plantilla de prueba (hello_world) y plantillas de producción con variables nombradas.
    """
    # Credenciales (idealmente desde variables de entorno)
    token = TEMP_TOKEN
    phone_id = TEMP_PHONE_ID
    # token = os.environ.get("WHATSAPP_TOKEN", "TU_TOKEN_AQUI")
    # phone_id = os.environ.get("PHONE_NUMBER_ID", "TU_PHONE_ID_AQUI")
    
    # Usamos v21.0 para asegurar soporte de Named Parameters
    version = "v21.0" 
    url = f"https://graph.facebook.com/{version}/{phone_id}/messages"
    
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    }

    # Estructura de componentes
    components = []
    
    # A. Lógica para Hello World (Sin componentes)
    if nombre_plantilla == "hello_world":
        language_code = "en_US"
    
    # B. Lógica para Plantillas Reales (Evento Centro)
    else:
        language_code = "es_CL" # O "es" según tu config en Meta
        print(f"{language_code=}")
        # --- PROCESAR ENCABEZADO (AQUÍ ES DONDE ENTRARÁ TU VARIABLE) ---
        if header_vars:
            h_params = []
            # Si es DICCIONARIO -> Usamos parameter_name (Lo que Meta te exige ahora)
            if isinstance(header_vars, dict):
                for key, val in header_vars.items():
                    h_params.append({
                        "type": "text",
                        "parameter_name": key,
                        "text": str(val)
                    })
            # Si es LISTA -> Posicional (Legacy)
            elif isinstance(header_vars, list):
                for val in header_vars:
                    h_params.append({
                        "type": "text",
                        "text": str(val)
                    })
            
            components.append({
                "type": "header",
                "parameters": h_params
            })

        # --- PROCESAR CUERPO (SE QUEDA VACÍO PARA TU CASO ACTUAL) ---
        if body_vars:
            b_params = []
            if isinstance(body_vars, dict):
                for key, val in body_vars.items():
                    b_params.append({
                        "type": "text",
                        "parameter_name": key,
                        "text": str(val)
                    })
            elif isinstance(body_vars, list):
                 for val in body_vars:
                    b_params.append({"type": "text", "text": str(val)})
            
            components.append({
                "type": "body",
                "parameters": b_params
            })

    payload = {
        "messaging_product": "whatsapp",
        "to": numero_destino,
        "type": "template",
        "template": {
            "name": nombre_plantilla,
            "language": {"code": language_code}
        }
    }

    if components:
        payload["template"]["components"] = components

    try:
        response = requests.post(url, headers=headers, json=payload, timeout=10)
        
        # Debugging: Si falla, mostramos qué dijo Meta
        if response.status_code not in [200, 201]:
            print(f" Error Meta: {response.text}")
            
        response.raise_for_status()
        return {"status": "success", "data": response.json()}
        
    except Exception as e:
        return {"status": "error", "message": str(e)}

def enviar_mensaje_prueba_wa(numero_destino):
    """
    Envía la plantilla 'hello_world' de WhatsApp a un número.
    El número debe incluir código de país sin '+' (ej. 56912345678).
    """
    # Intentará leer la variable de entorno, si no existe, usa tu hardcodeo
    token = os.environ.get("WHATSAPP_TOKEN_TEST", TEMP_TOKEN)
    phone_id = os.environ.get("PHONE_NUMBER_ID_TEST", TEMP_PHONE_ID)
    version = "v18.0"

    url = f"https://graph.facebook.com/{version}/{phone_id}/messages"
    
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json"
    }
    
    payload = {
        "messaging_product": "whatsapp",
        "to": numero_destino,
        "type": "template",
        "template": {
            "name": "hello_world",
            "language": {
                "code": "en_US"
            }
        }
    }
    
    try:
        response = requests.post(url, headers=headers, json=payload, timeout=10)
        response.raise_for_status() 
        return {"status": "success", "data": response.json()}
    except requests.exceptions.RequestException as e:
        error_details = response.text if response else str(e)
        print(f"❌ Error WhatsApp: {error_details}")
        return {"status": "error", "message": str(e), "details": error_details}