from math import ceil
from fastapi import Request


def get_paginated_response(
    *,
    query,
    request: Request,
    page: int = 1,
    limit: int = 10,
):

    page = max(page, 1)
    limit = max(limit, 1)

    total_records = query.count()

    total_pages = ceil(total_records / limit)

    offset = (page - 1) * limit

    data = query.offset(offset).limit(limit).all()

    has_next = page < total_pages
    has_previous = page > 1

    next_page = page + 1 if has_next else None
    previous_page = page - 1 if has_previous else None

    # Current query params
    query_params = dict(request.query_params)

    next_page_url = None
    previous_page_url = None

    if has_next:
        query_params["page"] = next_page
        next_page_url = str(
            request.url.replace_query_params(**query_params)
        )

    if has_previous:
        query_params["page"] = previous_page
        previous_page_url = str(
            request.url.replace_query_params(**query_params)
        )

    return {
        "data": data,
        "pagination": {
            "current_page": page,
            "limit": limit,
            "total_pages": total_pages,
            "total_records": total_records,
            "previous_page": previous_page,
            "next_page_url": next_page_url,
            "previous_page_url": previous_page_url,
        },
    }