// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package internal

import (
	"math"

	"code.gitea.io/gitea/models/db"
)

// ParsePaginator parses a db.Paginator into a skip and limit
func ParsePaginator(paginator db.Paginator, max ...int) (int, int) {
	// Use a very large number to indicate no limit
	unlimited := math.MaxInt32
	if len(max) > 0 {
		// Some indexer engines have a limit on the page size, respect that
		unlimited = max[0]
	}

	if paginator == nil || paginator.IsListAll() {
		return 0, unlimited
	}

	// Warning: Do not use GetSkipTake() for *db.ListOptions
	// Its implementation could reset the page size with setting.API.MaxResponseItems
	if listOptions, ok := paginator.(*db.ListOptions); ok {
		if listOptions.Page >= 0 && listOptions.PageSize > 0 {
			var start int
			if listOptions.Page == 0 {
				start = 0
			} else {
				start = (listOptions.Page - 1) * listOptions.PageSize
			}
			return start, listOptions.PageSize
		}
		return 0, unlimited
	}

	return paginator.GetSkipTake()
}