package common

import "gorm.io/gorm"

type Pagination struct {
	Limit int    `form:"limit" json:"limit"`
	Page  int    `form:"page" json:"page"`
	Sort  string `form:"sort" json:"sort"`
	Total int64  `json:"total" swaggerignore:"true"`
}

func (p *Pagination) GetOffset() int {
	return (p.GetPage() - 1) * p.GetLimit()
}

func (p *Pagination) GetLimit() int {
	if p.Limit == -1 {
		return 999
	}
	if p.Limit == 0 {
		p.Limit = 10
	}
	return p.Limit
}

func (p *Pagination) GetPage() int {
	if p.Page == 0 {
		p.Page = 1
	}
	return p.Page
}

func (p *Pagination) GetSort() string {
	if p.Sort == "" {
		p.Sort = "id desc"
	}
	return p.Sort
}

// Paginate scope
func Paginate(model interface{}, pagination *Pagination, db *gorm.DB) func(db *gorm.DB) *gorm.DB {
	var total int64
	db.Model(model).Count(&total)

	pagination.Total = total

	return func(db *gorm.DB) *gorm.DB {
		return db.Offset(pagination.GetOffset()).Limit(pagination.GetLimit()).Order(pagination.GetSort())
	}
}
