"""
Consulta del estado de un envio, de cualquier canal.

`/mail/<uuid>` sigue existiendo por compatibilidad, pero este endpoint sirve
para los tres canales: la auditoria es la misma tabla y el identificador es
del mismo tipo.
"""

from __future__ import annotations

from drf_spectacular.utils import extend_schema
from rest_framework.generics import RetrieveAPIView
from rest_framework.permissions import IsAuthenticated

from core.authentications.token_auth import TokenAuthentication
from core.permissions import HasScope
from keys.models.api_keys import SCOPE_MESSAGES_READ
from notifications.models.message import NotificationMessage
from notifications.querysets import mensajes_visibles_para
from notifications.serializers.message import NotificationMessageSerializer


class MessageStatus(RetrieveAPIView):
    """Estado de un envio y sus eventos de entrega."""

    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated, HasScope]
    required_scope = SCOPE_MESSAGES_READ
    serializer_class = NotificationMessageSerializer
    lookup_field = "pk"

    def get_queryset(self):
        # Sin este filtro, cualquier cliente con un UUID podia leer el envio
        # de otro: asunto, destinatarios, remitente y, si se guardan, los
        # cuerpos. El identificador viaja en la respuesta del envio, en los
        # webhooks y en los registros, asi que no es un secreto.
        return mensajes_visibles_para(
            NotificationMessage.objects.prefetch_related("events"),
            getattr(self.request, "api_key_record", None),
        )

    @extend_schema(
        summary="Consultar el estado de un envio",
        responses={200: NotificationMessageSerializer, 404: None},
    )
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)
