from typing import Any

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response


class CustomPagination(PageNumberPagination):
    page_size_query_param: str = "page_size"  # name of the query parameter, you can use any

    def get_paginated_response(self, data: dict[str, Any]) -> Response:
        return Response(
            {
                "links": {"forward": self.get_next_link(), "backward": self.get_previous_link()},
                "counts": {
                    "total_pages": None or self.page.paginator.num_pages,  # type: ignore [union-attr]
                    "page_size": None or self.page_size,
                    "total_items": None or self.page.paginator.count,  # type: ignore [union-attr]
                },
                "data": data,
            }
        )

    def get_paginated_response_schema(self, data_schema: dict[str, Any]) -> dict[str, Any]:
        return {
            "type": "object",
            "properties": {
                "links": {
                    "type": "object",
                    "properties": {
                        "forward": {
                            "type": "string",
                            "nullable": True,
                            "format": "uri",
                            "description": "URL to the next page",
                        },
                        "backward": {
                            "type": "string",
                            "nullable": True,
                            "format": "uri",
                            "description": "URL to the previous page",
                        },
                    },
                },
                "total_pages": {
                    "type": "integer",
                    "example": 10,
                    "description": "Total number of pages",
                },
                "page_size": {
                    "type": "integer",
                    "example": 10,
                    "description": "Number of items per page",
                },
                "total_items": {
                    "type": "integer",
                    "example": 100,
                    "description": "Total number of items",
                },
                "data": data_schema,
            },
        }
