"""Serializer de lectura de la auditoria de envios."""

from __future__ import annotations

from rest_framework import serializers

from notifications.models.message import NotificationMessage


class NotificationEventSerializer(serializers.Serializer):
    event = serializers.CharField()
    recipient = serializers.CharField()
    occurred_at = serializers.DateTimeField()
    reason = serializers.CharField()


class NotificationMessageSerializer(serializers.ModelSerializer):
    """
    Estado de un envio.

    No expone el cuerpo del mensaje ni la lista de copia oculta: `bcc` es
    informacion que por definicion no debe circular, asi que solo se devuelve
    cuantos destinatarios ocultos habia.
    """

    events = NotificationEventSerializer(many=True, read_only=True)
    bcc_count = serializers.SerializerMethodField()

    class Meta:
        model = NotificationMessage
        fields = [
            "id",
            "channel",
            "status",
            "provider",
            "subject",
            "sender",
            "sender_name",
            "reply_to",
            "to",
            "cc",
            "bcc_count",
            "recipient_count",
            "template_id",
            "attachment_count",
            "provider_message_id",
            "attempts",
            "error_code",
            "error_message",
            "created_at",
            "sent_at",
            "last_event_at",
            "events",
        ]
        read_only_fields = fields

    def get_bcc_count(self, obj) -> int:
        return len(obj.bcc or [])
