from apps.vehicle import models
from apps.vehicle.filters.vehicle_filters import (
    VehicleMakeListFilter,
    VehicleMakeModelListFilter,
)
from apps.vehicle.serializers import vehicle_serializers
from base.permissions import IsAdminToAllowCRUD
from base.views import BaseModelViewSet


class VehicleMakeModelViewSet(BaseModelViewSet):
    """
    This is the VehicleMakeModelViewSet class responsible for managing vehicle make data.

    It provides endpoints for creating, retrieving, updating, and deleting vehicle make records.

    Attributes:
        permission_classes (tuple): Specifies the permissions required to access this view. It's set to IsAuthenticated
                                   and IsAdminUser, allowing only authenticated and admin users to
                                   interact with vehicle make records.
        serializer_class (vehicle_serializers.VehicleMakeMasterSerializers): The serializer class used to serialize and
        deserialize vehicle make data.
        queryset (QuerySet): The queryset of vehicle make records that this viewset operates on.
        search_fields (list): A list of fields used for searching vehicle make records.
        http_method_names (list): A list of the allowed HTTP methods for this viewset,
        including 'get', 'patch', and 'delete'.

    Methods:
        get(request, *args, **kwargs): Retrieves vehicle make data based on the request parameters.
    """

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = vehicle_serializers.VehicleMakeMasterSerializers
    queryset = models.VehicleMakeMaster.objects.all()
    filterset_class = VehicleMakeListFilter
    search_fields = ["name"]
    http_method_names = ["get", "post", "patch", "delete"]


class VehicleModelModelViewSet(BaseModelViewSet):
    """
    A viewset for handling CRUD operations on VehicleModel instances.

    This viewset supports the standard CRUD operations - Create, Retrieve,
    Update, and Delete - for the VehicleModel model. It also includes filtering
    based on the 'vehicle_make' field and searching based on 'name'.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = vehicle_serializers.VehicleModelMasterSerializers
    queryset = models.VehicleModelMaster.objects.all()
    filterset_class = VehicleMakeModelListFilter
    search_fields = ["name"]
    http_method_names = ["get", "post", "patch", "delete"]

    def get_queryset(self):
        """
        Get the queryset of VehicleModel instances.

        If 'vehicle_make' is present in the query parameters, filter the queryset
        based on the provided vehicle_make value.

        Returns:
            queryset: The queryset of VehicleModel instances.
        """
        vehicle_make = self.request.query_params.get("vehicle_make")
        if vehicle_make:
            return self.queryset.filter(vehicle_make=vehicle_make)
        return self.queryset
