from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

DEFAULT_PAGE_SIZE = 10
ALLOWED_PAGE_SIZES = {10, 30, 50, 100}


class CustomPagination(PageNumberPagination):
    page_size = DEFAULT_PAGE_SIZE
    page_size_query_param = "page_size"
    max_page_size = 10000

    def paginate_queryset(self, queryset, request, view=None):
        page_size = request.query_params.get(self.page_size_query_param)

        if page_size == "all":
            return None

        if page_size:
            try:
                size = int(page_size)
                self.page_size = size if size in ALLOWED_PAGE_SIZES else DEFAULT_PAGE_SIZE
            except (TypeError, ValueError):
                self.page_size = DEFAULT_PAGE_SIZE
        else:
            self.page_size = DEFAULT_PAGE_SIZE

        return super().paginate_queryset(queryset, request, view)

    def get_paginated_response(self, data):
        return Response(
            {
                "count": self.page.paginator.count,
                "next": self.get_next_link(),
                "previous": self.get_previous_link(),
                "results": data,
            }
        )

    @staticmethod
    def build_all_response(data):
        return Response(
            {
                "count": len(data),
                "next": None,
                "previous": None,
                "results": data,
            }
        )
