"""ScheduledCampaigns applications serializers."""
from django.urls import reverse
from rest_framework import serializers

from scheduledcampaigns.models import ScheduledCampaign


class EventSerializer(serializers.ModelSerializer):
    """Event Serializer."""

    title = serializers.SerializerMethodField()
    url = serializers.SerializerMethodField()

    class Meta:
        """Meta class."""
        model = ScheduledCampaign
        fields = ["start", "end", "title", "url"]

    def get_title(self, instance: ScheduledCampaign) -> str:
        """Get title of event."""
        return f"{instance.campaign.title} | {instance.campaign.advertiser.name}"

    def get_url(self, instance: ScheduledCampaign) -> str:
        """Get campaign url of event."""
        return reverse(
            f"admin:{instance.campaign._meta.app_label}_{instance.campaign._meta.model_name}_change",
            args=(instance.campaign.id,),
        )


class EventsQueryParamsSerializer(serializers.Serializer):
    """Serializer for events query params."""
    start = serializers.DateTimeField(required=True)
    end = serializers.DateTimeField(required=True)
    destination = serializers.CharField(required=True)
    place = serializers.UUIDField(required=True)

    def validate(self, attrs: dict[str, any]) -> dict[str, any]:
        """Validate if start date is before end. """
        if attrs["end"] < attrs["start"]:
            raise serializers.ValidationError("'end' should not be older than 'start'")
        return attrs
