"""
Servicio WhatsApp — Meta Business API Client
================================================
Envía mensajes usando templates pre-aprobados de Meta.
Nunca bloquea el request — siempre se llama desde tareas Celery.
"""

import logging

import requests
from django.conf import settings

logger = logging.getLogger("apps.notifications")


class WhatsAppClient:
    """
    Cliente para la API de WhatsApp Business (Meta Graph API v18.0).
    Usa templates pre-aprobados — no envía texto libre.
    """

    def __init__(self):
        self.api_url = settings.WHATSAPP_API_URL.rstrip("/")
        self.token = settings.WHATSAPP_TOKEN
        self.phone_id = settings.WHATSAPP_PHONE_ID
        self.timeout = 30

    @property
    def _headers(self):
        return {
            "Authorization": f"Bearer {self.token}",
            "Content-Type": "application/json",
        }

    @property
    def _base_url(self):
        return f"{self.api_url}/{self.phone_id}/messages"

    def _is_configured(self):
        """Verifica que las credenciales estén configuradas."""
        if not self.token or self.token == "your-meta-whatsapp-access-token":
            logger.warning("WhatsApp no configurado: WHATSAPP_TOKEN vacío o placeholder")
            return False
        if not self.phone_id or self.phone_id == "your-whatsapp-phone-id":
            logger.warning("WhatsApp no configurado: WHATSAPP_PHONE_ID vacío o placeholder")
            return False
        return True

    def enviar_template(self, numero, template_name, language="pt", components=None):
        """
        Envía un mensaje usando un template pre-aprobado de Meta.

        Args:
            numero: Número de teléfono con código de país (ej: "244923456789")
            template_name: Nombre del template en Meta (ej: "cita_confirmada")
            language: Código de idioma del template (default: "pt" para portugués)
            components: Lista de componentes del template (parámetros)

        Returns:
            dict con keys:
                ok (bool): Si el envío fue exitoso
                message_id (str): ID del mensaje si exitoso
                error (str): Detalle del error si falló
        """
        if not self._is_configured():
            return {
                "ok": False,
                "message_id": "",
                "error": "WhatsApp API no configurado — credenciales faltantes",
            }

        # Sanitizar número: solo dígitos
        numero_limpio = "".join(c for c in str(numero) if c.isdigit())
        if not numero_limpio or len(numero_limpio) < 9:
            return {
                "ok": False,
                "message_id": "",
                "error": f"Número de teléfono inválido: {numero}",
            }

        payload = {
            "messaging_product": "whatsapp",
            "to": numero_limpio,
            "type": "template",
            "template": {
                "name": template_name,
                "language": {"code": language},
            },
        }

        if components:
            payload["template"]["components"] = components

        try:
            response = requests.post(
                self._base_url,
                headers=self._headers,
                json=payload,
                timeout=self.timeout,
            )

            if response.status_code in (200, 201):
                data = response.json()
                message_id = ""
                messages = data.get("messages", [])
                if messages:
                    message_id = messages[0].get("id", "")

                logger.info(
                    "WhatsApp enviado OK: template=%s, destino=%s, msg_id=%s",
                    template_name,
                    numero_limpio[-4:],  # Solo últimos 4 dígitos por seguridad
                    message_id,
                )
                return {"ok": True, "message_id": message_id, "error": ""}

            # Error de la API
            error_body = response.text[:500]
            logger.error(
                "WhatsApp API error %s: template=%s, destino=***%s, body=%s",
                response.status_code,
                template_name,
                numero_limpio[-4:],
                error_body,
            )
            return {
                "ok": False,
                "message_id": "",
                "error": f"HTTP {response.status_code}: {error_body}",
            }

        except requests.Timeout:
            msg = "Timeout al conectar con la API de WhatsApp"
            logger.error(msg)
            return {"ok": False, "message_id": "", "error": msg}

        except requests.ConnectionError:
            msg = "Error de conexión con la API de WhatsApp"
            logger.error(msg)
            return {"ok": False, "message_id": "", "error": msg}

        except requests.RequestException as e:
            msg = f"Error inesperado al enviar WhatsApp: {e}"
            logger.exception(msg)
            return {"ok": False, "message_id": "", "error": msg}


# ── Helpers para construir componentes de template ────────────

def build_body_params(*params):
    """
    Construye la lista de componentes body con parámetros de texto.
    Uso: build_body_params("Dr. Mariela", "15/04/2026", "10:00")
    """
    parameters = [{"type": "text", "text": str(p)} for p in params]
    return [{"type": "body", "parameters": parameters}]


# ── Instancia singleton ──────────────────────────────────────
whatsapp_client = WhatsAppClient()
