"""
Serializers del canal de SMS.

El anterior era:

    class SMSAppSerializer(serializers.Serializer):
        to = serializers.ListField(child=serializers.CharField())
        body = serializers.CharField()

Sin limite de destinatarios, sin limite de longitud y sin validar el formato
de los numeros. Con una credencial valida se podia mandar un cuerpo de un
megabyte a mil numeros en una sola peticion: Twilio lo trocea en segmentos y
factura cada uno.
"""

from __future__ import annotations

from django.conf import settings
from rest_framework import serializers

from notifications.serializers.phone import PhoneListField


class SMSSendSerializer(serializers.Serializer):
    """Peticion de envio de SMS."""

    to = PhoneListField(allow_empty=False)
    body = serializers.CharField(trim_whitespace=False)
    send_async = serializers.BooleanField(
        default=True,
        help_text=(
            "True encola los envios y responde 202. False espera al proveedor."
        ),
    )

    def validate_body(self, value: str) -> str:
        if not value.strip():
            raise serializers.ValidationError("El cuerpo del mensaje esta vacio.")

        maximo = settings.MESSAGING_MAX_BODY_CHARS
        if len(value) > maximo:
            raise serializers.ValidationError(
                f"El mensaje tiene {len(value)} caracteres y el maximo es {maximo}. "
                "Cada 153 caracteres se facturan como un SMS adicional."
            )
        return value


#: Nombre anterior, conservado para no romper imports externos.
SMSAppSerializer = SMSSendSerializer
