from rest_framework import pagination


class CustomPagination(pagination.LimitOffsetPagination):
    """
    A custom pagination class that extends LimitOffsetPagination to provide custom behavior.

    Attributes:
        default_limit (int): The default limit for paginated results.

    Methods:
        __init__(): Initialize instance variables.
        paginate_queryset(queryset, request, view): Paginate the queryset based on the request and view.
        get_limit(request, total_count): Get the pagination limit based on the request query parameters.
    """

    default_limit = 10

    def __init__(self):
        """
        Initialize instance variables.

        Args:
            None

        Returns:
            None
        """
        self.request = None
        self.offset = None
        self.limit = None
        self.count = None

    def paginate_queryset(self, queryset, request, view=None):
        """
        Paginate the queryset based on the request and view.

        Args:
            queryset: The queryset to be paginated.
            request: The HTTP request.
            view: The view that handles the request.

        Returns:
            list or None: The paginated queryset based on the request parameters,
            or None if pagination is not applicable.
        """
        self.count = self.get_count(queryset)
        self.limit = self.get_limit(request, total_count=self.count)
        if self.limit is None:
            return None

        self.offset = self.get_offset(request)
        self.request = request
        if self.count > self.limit and self.template is not None:
            self.display_page_controls = True

        if self.count == 0 or self.offset > self.count:
            return []
        return list(queryset[self.offset: self.offset + self.limit])

    def get_limit(self, request, total_count=None):
        """
        Get the pagination limit based on the request query parameters.

        Args:
            request: The HTTP request.
            total_count: The total count of items in the queryset (optional).

        Returns:
            int: The limit for pagination.
        """
        if request.query_params.get(self.limit_query_param) == "all":
            return total_count
        return super().get_limit(request=request)
