from typing import Generic, List, TypeVar, Optional
from pydantic import BaseModel
from ninja.pagination import PaginationBase
from django.db.models import QuerySet

T = TypeVar('T')

class PageResponse(BaseModel, Generic[T]):
    items: List[T]
    total: int
    page: int
    size: int
    pages: int

class StandardPagination(PaginationBase):
    class Input(BaseModel):
        page: int = 1
        size: int = 20

    class Output(BaseModel, Generic[T]):
        items: List[T]
        total: int
        page: int
        size: int
        pages: int

    def paginate_queryset(self, queryset: QuerySet, pagination: Input, **params):
        page = max(1, pagination.page)
        size = min(max(1, pagination.size), 100)
        total = queryset.count()
        pages = (total + size - 1) // size if total > 0 else 1
        
        offset = (page - 1) * size
        items = list(queryset[offset:offset + size])
        
        return {
            'items': items,
            'total': total,
            'page': page,
            'size': size,
            'pages': pages,
        }
