from rest_framework import serializers

from apps.account.models import ContactUs, ContactUsAssets
from apps.master import models as master_models
from apps.master.serializers import master_serializers
from base.serializers import DynamicFieldsModelSerializer


class ContactUsAssetsSerializer(DynamicFieldsModelSerializer):
    """
    Serializer class for serializing and deserializing ContactUsAssets instances.

    This serializer class includes fields for 'id' and 'asset'.
    'id' is marked as read-only.

    Attributes:
        Meta.model: The model class to which this serializer applies.
        Meta.fields: The fields to include in the serialized representation.
        Meta.read_only_fields: The fields that should be treated as read-only during updates.
    """

    class Meta:
        model = ContactUsAssets
        fields = (
            "id",
            "asset",
        )
        read_only_fields = ["id"]


class ContactUsSerializer(DynamicFieldsModelSerializer):
    """
    Serializer class for serializing and deserializing ContactUs instances.

    This serializer class includes fields for 'id', 'first_name', 'last_name', 'email',
    'phone_number', 'subject', 'contact_request_type', 'description', and 'assets'.
    'id' is marked as read-only.

    Attributes:
        assets (MethodField): Serializer method field for representing associated media assets.
        Meta.model: The model class to which this serializer applies.
        Meta.fields: The fields to include in the serialized representation.
        Meta.read_only_fields: The fields that should be treated as read-only during updates.
    """

    assets = serializers.SerializerMethodField(read_only=True)
    contact_request_type = serializers.PrimaryKeyRelatedField(
        write_only=True, queryset=master_models.ContactUsRequestTypeMaster.objects.all()
    )
    contact_request_type_data = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = ContactUs
        fields = (
            "id",
            "first_name",
            "last_name",
            "email",
            "phone_number",
            "subject",
            "contact_request_type",
            "contact_request_type_data",
            "description",
            "assets",
        )
        read_only_fields = ["id"]
        write_only_fields = ["contact_request_type"]

    def get_assets(self, obj):
        """
        Retrieve and format associated media assets.

        Args:
            obj (ContactUs): The ContactUs instance.

        Returns:
            List of dictionaries with media asset details.
        """
        medias = obj.contact_us_assets.all()
        media_data = []

        for media in medias:
            if media.asset:
                media_item = {
                    "id": media.id,
                    "asset": self.context["request"].build_absolute_uri(
                        media.asset.url
                    ),
                }
                media_data.append(media_item)

        return media_data

    def get_contact_request_type_data(self, obj):
        """
        Retrieve and format data related to the contact request type.

        Args:
            obj (ContactUs): The ContactUs instance.

        Returns:
            dict: Dictionary with details of the contact request type, or None if no request type is set.
        """
        if obj.contact_request_type:
            # Serialize the contact request type and return its data
            return master_serializers.ContactUsRequestTypeSerializers(
                obj.contact_request_type
            ).data
        return None
