from apps.master import models as master_models
from apps.master.filters.master_filters import (
    AmenitiesListFilter,
    ConnectorListFilter,
    LocationsListFilter,
    NetworkOperatorListFilter,
)
from apps.master.serializers import master_serializers
from base.permissions import IsAdminToAllowCRUD
from base.views import BaseModelViewSet


class AmenitiesModelViewSet(BaseModelViewSet):
    """
    This is the AmenitiesModelViewSet class responsible for managing amenities data.

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

    Attributes:
        permission_classes (tuple): Specifies the permissions required to access this view.
        It's set to IsAdminToAllowCRUD, allowing any users get and list amenities,
        but only admin user will be able to create, update and delete amenities
        serializer_class (station_serializers.AmenitiesMasterSerializers): The serializer class used to serialize
        and deserialize amenities data.
        filter_backends (list): A list of filter backends to use for filtering amenities data.
        queryset (QuerySet): The queryset of amenities records that this viewset operates on.
        filterset_class (AmenitiesListFilter): The filterset class used to filter amenities data.
        http_method_names (list): A list of the HTTP methods that this viewset supports.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.AmenitiesMasterSerializers
    queryset = master_models.AmenitiesMaster.objects.all()
    filterset_class = AmenitiesListFilter
    http_method_names = ["get", "post", "patch", "delete"]


class ConnectorModelViewSet(BaseModelViewSet):
    """
    This is the ConnectorModelViewSet class responsible for managing connector data.

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

    Attributes:
        permission_classes (tuple): Specifies the permissions required to access this view.
        IsAdminToAllowCRUD, allowing any users get and list connectors,
        but only admin user will be able to create, update and delete connectors
        serializer_class (station_serializers.ConnectorMasterSerializers): The serializer class used to serialize and
        deserialize connector data.
        filter_backends (list): A list of filter backends to use for filtering connector data.
        queryset (QuerySet): The queryset of connector records that this viewset operates on.
        filterset_class (ConnectorListFilter): The filterset class used to filter connector data.
        http_method_names (list): A list of the HTTP methods that this viewset supports.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.ConnectorMasterSerializers
    queryset = master_models.ConnectorMaster.objects.all()
    filterset_class = ConnectorListFilter
    http_method_names = ["get", "post", "patch", "delete"]


class LocationModelViewSet(BaseModelViewSet):
    """
    This is the ConnectorModelViewSet class responsible for managing connector data.

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

    Attributes:
        permission_classes (tuple): Specifies the permissions required to access this view.
        IsAdminToAllowCRUD, allowing any users get and list location,
        but only admin user will be able to create, update and delete locations
        serializer_class (station_serializers.ConnectorMasterSerializers): The serializer class used to serialize and
        deserialize connector data.
        filter_backends (list): A list of filter backends to use for filtering connector data.
        queryset (QuerySet): The queryset of connector records that this viewset operates on.
        filterset_class (ConnectorListFilter): The filterset class used to filter connector data.
        http_method_names (list): A list of the HTTP methods that this viewset supports.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.LocationMasterSerializers
    queryset = master_models.LocationMaster.objects.all()
    filterset_class = LocationsListFilter
    http_method_names = ["get", "post", "patch", "delete"]


class NetworkOperatorModelViewSet(BaseModelViewSet):
    """
    This is the NetworkOperatorModelViewSet class responsible for managing network operator data.

    It provides endpoints for creating, retrieving, updating, and deleting network operator records.

    Attributes:
        permission_classes (tuple): Specifies the permissions required to access this view.
        IsAdminToAllowCRUD, allowing any users get and list networks,
        but only admin user will be able to create, update and delete networks
        serializer_class (master_serializers.NetworkOperatorMasterSerializers): The serializer class used to serialize
        and deserialize network operator data.
        filter_backends (list): A list of filter backends to use for filtering network operator data.
        queryset (QuerySet): The queryset of network operator records that this viewset operates on.
        filterset_class (NetworkOperatorListFilter): The filterset class used to filter network operator data.
        http_method_names (list): A list of the HTTP methods that this viewset supports.

    Methods:
        get(request, *args, **kwargs): Retrieves network operator data based on the request parameters.

    Meta:
        permissions (tuple): Permissions required to access this view (AllowAny for public access).
        serializer_class (NetworkOperatorMasterSerializers): The serializer used for input/output data.
        filter_backends (list): Filter backends used for filtering network operator data.
        queryset (QuerySet): The queryset of network operator records.
        filterset_class (NetworkOperatorListFilter): The filterset used for filtering network operator data.
        http_method_names (list): The allowed HTTP methods for this viewset.
    """

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.NetworkOperatorMasterSerializers
    queryset = master_models.NetworkOperatorMaster.objects.all()
    filterset_class = NetworkOperatorListFilter
    http_method_names = ["get", "post", "patch", "delete"]


class RatingLabelsAssetModelViewSet(BaseModelViewSet):
    """
    This is the ConnectorModelViewSet class responsible for managing connector data.

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

    Attributes:
        permission_classes (tuple): Specifies the permissions required to access this view.
        IsAdminToAllowCRUD, allowing any users get and list RatingLabels,
        but only admin user will be able to create, update and delete RatingLabels
        serializer_class (station_serializers.RatingLabelsAssetSerializers): The serializer class used to serialize and
        deserialize connector data.
        queryset (QuerySet): The queryset of RatingLabelsAsset records that this viewset operates on.
        http_method_names (list): A list of the HTTP methods that this viewset supports.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.RatingLabelsAssetSerializers
    queryset = master_models.RatingLabelsAsset.objects.all()
    http_method_names = ["get", "post", "patch", "delete"]


class PrivacyPolicyModelViewSet(BaseModelViewSet):
    """
    A viewset for managing PrivacyPolicyMaster instances.

    Permissions:
        * IsAdminToAllowCRUD: User must be an admin to create, update, or delete PrivacyPolicyMaster instances.

    Methods:
        * get: Retrieve a list of PrivacyPolicyMaster instances.
        * post: Create a new PrivacyPolicyMaster instance.
    """

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.PrivacyPolicySerializers
    queryset = master_models.PrivacyPolicyMaster.objects.all()
    http_method_names = ["get", "post"]

    def perform_create(self, serializer):
        """
        Create a new PrivacyPolicyMaster instance.

        If a PrivacyPolicyMaster instance already exists, update its content. Otherwise, create a new PrivacyPolicyMaster instance.

        Args:
            serializer: The serializer containing the validated data for the new PrivacyPolicyMaster instance.
        """
        if master_models.PrivacyPolicyMaster.objects.exists():
            privacy_policy = master_models.PrivacyPolicyMaster.objects.first()
            privacy_policy.content = serializer.validated_data["content"]
            privacy_policy.save()
        else:
            serializer.save()


class TermsOfUseModelViewSet(BaseModelViewSet):
    """
    A viewset for managing TermsOfUseMaster instances.

    Permissions:
        * IsAdminToAllowCRUD: User must be an admin to create, update, or delete TermsOfUseMaster instances.

    Methods:
        * get: Retrieve a list of TermsOfUseMaster instances.
        * post: Create a new TermsOfUseMaster instance.
    """

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.TermsOfUseSerializers
    queryset = master_models.TermsOfUseMaster.objects.all()
    http_method_names = ["get", "post"]

    def perform_create(self, serializer):
        """
        Create a new TermsOfUseMaster instance.

        If a TermsOfUseMaster instance already exists, update its content. Otherwise,
        create a new TermsOfUseMaster instance.

        Args:
            serializer: The serializer containing the validated data for the new TermsOfUseMaster instance.
        """
        if master_models.TermsOfUseMaster.objects.exists():
            terms_of_use = master_models.TermsOfUseMaster.objects.first()
            terms_of_use.content = serializer.validated_data["content"]
            terms_of_use.save()
        else:
            serializer.save()

        return serializer


class RatingLabelsModelViewSet(BaseModelViewSet):
    """
    A viewset for handling CRUD operations on RatingLabelMaster instances.

    This viewset supports the standard CRUD operations - Create, Retrieve,
    Update, and Delete - for the RatingLabelMaster model.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.RatingLabelsSerializers
    queryset = master_models.RatingLabelMaster.objects.all()
    http_method_names = ["get", "post", "patch", "delete"]


class FaqModelViewSet(BaseModelViewSet):
    """
    A viewset for handling CRUD operations on FaqMaster instances.

    This viewset supports the standard CRUD operations - Create, Retrieve,
    Update, and Delete - for the FaqMaster model.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.FaqSerializers
    queryset = master_models.FaqMaster.objects.all().order_by("id")
    http_method_names = ["get", "post", "patch", "delete"]


class ContactUsRequestTypeModelViewSet(BaseModelViewSet):
    """
    A viewset for handling CRUD operations on ContactUsRequestTypeMaster instances.

    This viewset supports the standard CRUD operations - Create, Retrieve,
    Update, and Delete - for the ContactUsRequestTypeMaster model.

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

    permission_classes = (IsAdminToAllowCRUD,)
    serializer_class = master_serializers.ContactUsRequestTypeSerializers
    queryset = master_models.ContactUsRequestTypeMaster.objects.all().order_by("id")
    http_method_names = ["get", "post", "patch", "delete"]
