import json

from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from apps.vehicle import models
from apps.vehicle.filters.vehicle_filters import VehicleInsuranceListFilter
from apps.vehicle.serializers import vehicle_insurance_serializers
from base.views import BaseModelViewSet


class VehicleInsuranceModelViewSet(BaseModelViewSet):
    """
    A viewset for handling CRUD operations on VehicleInsurance instances.

    This viewset supports the standard CRUD operations - Create and Retrieve -
    for the VehicleInsurance model. It filters instances based on the authenticated user.

    Attributes:
        permission_classes (tuple): A tuple of permission classes.
        serializer_class: The serializer class for the VehicleInsurance model.
        queryset: The queryset containing all VehicleInsurance instances.
        filterset_class: The filterset class for supporting custom filtering.
        http_method_names (list): List of HTTP methods allowed on this viewset.
    """

    permission_classes = (IsAuthenticated,)
    serializer_class = vehicle_insurance_serializers.VehicleInsuranceSerializers
    queryset = models.VehicleInsurance.objects.all()
    filterset_class = VehicleInsuranceListFilter
    http_method_names = ["get", "post"]

    def get_queryset(self):
        """
        Get the queryset of VehicleInsurance instances for the authenticated user.

        Returns:
            queryset: The filtered queryset of VehicleInsurance instances.
        """
        return self.queryset.filter(user=self.request.user)

    def create(self, request, *args, **kwargs):
        request_data = request.data

        data_dict = {}
        for key, value in request_data.items():
            # If the value is a list, handle it accordingly
            if isinstance(value, list) and len(value) == 1:
                data_dict[key] = value[0]
            else:
                data_dict[key] = value

        # Convert list represented as string to actual list
        if "insurance_types" in data_dict:
            data_dict["insurance_types"] = json.loads(data_dict["insurance_types"])

        if "policy" in data_dict:
            del data_dict["policy"]

        # Convert the dictionary to JSON data
        json_data = json.dumps(data_dict)

        request_data = json.loads(json_data)

        if len(request.FILES) > 0:
            request_data["policy"] = request.FILES.get("policy")

        serializer = self.get_serializer(data=request_data)

        if serializer.is_valid():
            serializer.save(user=self.request.user)
            return Response(
                serializer.data,
                status=status.HTTP_201_CREATED,
            )
        else:
            return Response(
                serializer.errors,
                status=status.HTTP_400_BAD_REQUEST,
            )

    def perform_create(self, serializer):
        """
        Perform custom actions when creating a new VehicleInsurance instance.

        Args:
            serializer: The serializer instance handling the create operation.
        """
        serializer.save(user=self.request.user)
