"""
Envío de mensajes de WhatsApp vía Meta Cloud API (WhatsApp Business API).

Requiere: número de WhatsApp Business verificado, token de acceso, y las
plantillas de la sección 6 del documento ya APROBADAS por Meta (una plantilla
no aprobada devuelve error al enviar). Ver sección 9 del documento (checklist
de prerrequisitos).

En modo DRY_RUN (default) no se envía nada de verdad: solo se registra lo que
se habría mandado, para poder validar la lógica del agente antes de tocar
clientes reales.
"""
import requests
import config
import registro


def _url():
    return f"https://graph.facebook.com/{config.WHATSAPP_API_VERSION}/{config.WHATSAPP_PHONE_NUMBER_ID}/messages"


def enviar_plantilla(telefono: str, nombre_plantilla: str, parametros: list,
                      cliente_id="", cliente_nombre="", referencia="", tipo=""):
    """Envía (o simula, en dry-run) un mensaje de plantilla al cliente.

    parametros: lista de strings, en el mismo orden que las variables
    {{1}}, {{2}}, ... definidas en la plantilla aprobada en Meta.
    """
    payload = {
        "messaging_product": "whatsapp",
        "to": telefono,
        "type": "template",
        "template": {
            "name": nombre_plantilla,
            "language": {"code": config.WHATSAPP_IDIOMA_PLANTILLA},
            "components": [{
                "type": "body",
                "parameters": [{"type": "text", "text": str(p)} for p in parametros],
            }],
        },
    }

    if config.DRY_RUN:
        registro.registrar(tipo=tipo, cliente_id=cliente_id, cliente_nombre=cliente_nombre,
                            referencia=referencia, canal="whatsapp_cliente", resultado="dry_run",
                            detalle=f"plantilla={nombre_plantilla} params={parametros}")
        return {"dry_run": True, "payload": payload}

    resp = requests.post(
        _url(),
        headers={"Authorization": f"Bearer {config.WHATSAPP_TOKEN}"},
        json=payload,
        timeout=15,
    )
    ok = resp.status_code == 200
    registro.registrar(tipo=tipo, cliente_id=cliente_id, cliente_nombre=cliente_nombre,
                        referencia=referencia, canal="whatsapp_cliente",
                        resultado="enviado" if ok else f"error_{resp.status_code}",
                        detalle=resp.text[:500])
    return resp.json()
