from rest_framework import status
from rest_framework.response import Response

from apps.account.models import ContactUs
from apps.account.serializers.contact_us_serializers import (
    ContactUsSerializer,
    ContactUsAssetsSerializer,
)
from base.permissions import AdminOrPostOnlyPermission
from base.views import BaseModelViewSet


class ContactUsModelViewSet(BaseModelViewSet):
    """
    ViewSet for handling ContactUs model operations.

    This ViewSet provides API endpoints for creating and retrieving ContactUs instances.

    Attributes:
        permission_classes (list): List of permission classes, allowing any user to access.
        serializer_class (ContactUsSerializer): Serializer class for ContactUs model.
        queryset (QuerySet): QuerySet of ContactUs instances ordered by descending 'id'.
        http_method_names (list): List of allowed HTTP methods - POST and GET.
    """

    permission_classes = [AdminOrPostOnlyPermission]
    serializer_class = ContactUsSerializer
    queryset = ContactUs.objects.all().order_by("-id")
    http_method_names = ["post", "get"]

    def create(self, request, *args, **kwargs):
        """
        Create a new ContactUs instance and associated ContactUsAssets instances.

        Args:
            request (Request): The HTTP request object.
            *args: Variable-length argument list.
            **kwargs: Arbitrary keyword arguments.

        Returns:
            Response: The HTTP response object.
        """

        # Create ContactUs instance
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        # Create ContactUsAssets instances
        assets = []
        for index, file in enumerate(request.FILES):
            assets.append(
                {
                    "asset": request.FILES.get(f"asset[{index}]"),
                }
            )

        assets_serializer = ContactUsAssetsSerializer(data=assets, many=True)
        assets_serializer.is_valid(raise_exception=True)
        contact_us = ContactUs.objects.get(pk=serializer.data["id"])
        assets_serializer.save(contact_us=contact_us)

        # Serialize and return the created ContactUs instance
        serializer = self.get_serializer(contact_us)

        return Response(serializer.data, status=status.HTTP_201_CREATED)
