# Pagination template
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
from rest_framework.response import Response

class HybridPagination(PageNumberPagination, LimitOffsetPagination):
    """
    A pagination class that works with both PageNumber (page/size) and Limit/Offset.
    
    - If 'limit' or 'offset' is present in the query parameters, uses limit/offset behaviour.
    - Otherwise, falls back to page/size behaviour (with default page_size=20).
    
    Query examples:
        GET /api/items/?page=2&size=10      -> page 2, 10 items per page
        GET /api/items/?limit=50&offset=100 -> items 101-150
        GET /api/items/                      -> page 1, page_size=20 (default)
    """
    page_size = 20
    page_size_query_param = 'size'
    max_page_size = 1000
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    max_limit = 1000

    def get_paginated_response(self, data):
        # Check which pagination style was actually used
        if getattr(self, 'limit', None) is not None:
            # Used LimitOffsetPagination style
            return Response({
                'count': self.count,
                'next': self.get_next_link(),
                'previous': self.get_previous_link(),
                'results': data
            })
        else:
            # Used PageNumberPagination style – return page-specific metadata
            return Response({
                'count': self.count,
                'next': self.get_next_link(),
                'previous': self.get_previous_link(),
                'results': data,
                'page': self.page.number,
                'pages': self.page.paginator.num_pages,
            })

    def paginate_queryset(self, queryset, request, view=None):
        # Detect if limit/offset params are present
        if request.query_params.get(self.limit_query_param) is not None \
           or request.query_params.get(self.offset_query_param) is not None:
            # Use LimitOffsetPagination logic
            self.limit = self.get_limit(request)
            if self.limit is None:
                return None
            self.offset = self.get_offset(request)
            self.count = self.get_count(queryset)
            self.request = request
            if self.count == 0 or self.offset > self.count:
                return []
            return list(queryset[self.offset:self.offset + self.limit])
        else:
            # Fallback to PageNumberPagination
            return super().paginate_queryset(queryset, request, view)

# Alias for backward compatibility if you already use MyPageNumberPagination elsewhere
MyPageNumberPagination = HybridPagination