package helpers

import (
	"math"

	"gorm.io/gorm"
)

type PaginatedResult struct {
	NumPages    int64
	CurrentPage int64
	NextPage    int64 `json:"next_page,omitempty"`
}

func Paginate(db *gorm.DB, pagination *PaginatedResult, opts ...QueryOption) func(db *gorm.DB) *gorm.DB {
	q := Query{
		PageSize: 50,
		Page:     0,
	}

	for _, opt := range opts {
		opt(&q)
	}

	var totalRows int64
	db.Count(&totalRows)

	offset := (q.Page - 1) * q.PageSize

	pagination.NumPages = int64(math.Ceil(float64(totalRows) / float64(q.PageSize)))
	pagination.CurrentPage = int64(q.Page)
	pagination.NextPage = int64(q.Page + 1)
	if pagination.CurrentPage >= pagination.NumPages {
		pagination.NextPage = pagination.NumPages
	}

	return func(db *gorm.DB) *gorm.DB {
		return db.
			Offset(offset).
			Limit(q.PageSize)
	}
}
