"""
Vistas — App Notifications
==============================
Endpoints de webhook para Meta WhatsApp Business API.
"""

import hashlib
import hmac
import json
import logging

from django.conf import settings
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_GET, require_http_methods

logger = logging.getLogger("apps.notifications")


@require_GET
def webhook_verify(request):
    """
    GET — Verificación de webhook de Meta.
    Meta envía hub.mode, hub.challenge, hub.verify_token.
    Respondemos con challenge si el token coincide.
    """
    mode = request.GET.get("hub.mode")
    token = request.GET.get("hub.verify_token")
    challenge = request.GET.get("hub.challenge")

    verify_token = getattr(settings, "WHATSAPP_VERIFY_TOKEN", "")

    if mode == "subscribe" and token == verify_token and verify_token:
        logger.info("Webhook verificado por Meta")
        return HttpResponse(challenge, content_type="text/plain")

    logger.warning("Intento de verificación de webhook fallido: mode=%s", mode)
    return HttpResponse("Forbidden", status=403)


@csrf_exempt
@require_http_methods(["GET", "POST"])
def webhook_receive(request):
    """
    Endpoint combinado para Meta WhatsApp webhook.
    GET → Verificación (redirige a webhook_verify logic)
    POST → Recibe delivery status updates y actualiza logs.
    """
    if request.method == "GET":
        return webhook_verify(request)

    # POST — Procesar status updates de Meta
    try:
        body = json.loads(request.body)
    except (json.JSONDecodeError, ValueError):
        return JsonResponse({"error": "Invalid JSON"}, status=400)

    # Meta espera siempre 200 para no reintentar
    _procesar_webhook_payload(body)
    return HttpResponse("OK", status=200)


def _procesar_webhook_payload(body):
    """
    Procesa el payload del webhook de Meta.
    Actualiza el estado de entrega en WhatsAppLog.
    """
    from .models import WhatsAppLog

    try:
        entries = body.get("entry", [])
        for entry in entries:
            changes = entry.get("changes", [])
            for change in changes:
                value = change.get("value", {})
                statuses = value.get("statuses", [])

                for status in statuses:
                    msg_id = status.get("id", "")
                    wa_status = status.get("status", "")

                    if not msg_id:
                        continue

                    # Mapear status de Meta a nuestro estado
                    if wa_status in ("delivered", "read"):
                        WhatsAppLog.objects.filter(
                            whatsapp_message_id=msg_id,
                        ).update(
                            estado=WhatsAppLog.Estado.ENVIADO,
                        )
                        logger.debug("Webhook: msg %s → %s", msg_id, wa_status)

                    elif wa_status == "failed":
                        errors = status.get("errors", [])
                        error_msg = errors[0].get("message", "Unknown") if errors else "Unknown"
                        WhatsAppLog.objects.filter(
                            whatsapp_message_id=msg_id,
                        ).update(
                            estado=WhatsAppLog.Estado.ERROR,
                            error_detalle=f"Webhook: {error_msg}",
                        )
                        logger.warning("Webhook: msg %s → failed: %s", msg_id, error_msg)

    except Exception:
        logger.exception("Error procesando webhook payload")
