"""
Envio de una plantilla aprobada de Twilio por WhatsApp.

Nota sobre los nombres: este endpoint se llama `/whatsapp/send` pero manda una
plantilla, y `/whatsapp/send/template` manda texto libre. Estan cruzados desde
el principio. Se conservan asi porque renombrarlos rompería a los clientes sin
ganar nada funcional.
"""

from __future__ import annotations

import logging

from drf_spectacular.utils import extend_schema
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

from core.authentications.token_auth import TokenAuthentication
from core.permissions import HasScope
from keys.models.api_keys import SCOPE_WHATSAPP_SEND
from notifications.channels.messaging.registry import UnknownProvider, get_provider
from notifications.controllers.v1.mail.conversation import _error
from notifications.models.message import Channel
from notifications.serializers.whatsapp import WhatsAppConversationSerializer
from notifications.services.messenger import send_many
from notifications.services.results import resumen_de_envios
from notifications.throttling import SendThrottle

logger = logging.getLogger("notifications.whatsapp")


class Send(APIView):
    """Envia una plantilla de contenido de Twilio a cada numero."""

    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated, HasScope]
    required_scope = SCOPE_WHATSAPP_SEND
    throttle_classes = [SendThrottle]

    @extend_schema(
        summary="Enviar plantilla de WhatsApp",
        request=WhatsAppConversationSerializer,
        responses={200: None, 202: None, 207: None, 400: None, 503: None},
    )
    def post(self, request, format=None):
        serializer = WhatsAppConversationSerializer(
            data=request.data, context={"request": request}
        )
        serializer.is_valid(raise_exception=True)
        datos = serializer.validated_data

        try:
            provider = get_provider()
        except UnknownProvider as exc:
            return _error(
                request,
                "provider_unavailable",
                str(exc),
                status.HTTP_503_SERVICE_UNAVAILABLE,
            )

        mensajes = send_many(
            channel=Channel.WHATSAPP,
            numbers=datos["to"],
            template_sid=datos["template"],
            template_variables=datos["vars"],
            provider_name=provider.name,
            send_async=datos.get("send_async", True),
            request=request,
            api_key=getattr(request, "api_key_record", None),
        )

        return resumen_de_envios(request, mensajes, Channel.WHATSAPP)
