package domain

import (
	"github.com/tidbcloud/dataflow-service-ng/app/config"
	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"
)

type Pager struct {
	Page     int64
	PageSize int64
}

type PagerOptionOp func(*Pager)

func NewPager(ops ...PagerOptionOp) *Pager {
	p := &Pager{
		Page:     config.DEFAULT_PAGE_NUMBER,
		PageSize: config.DEFAULT_PAGE_SIZE,
	}
	for _, op := range ops {
		op(p)
	}
	return p
}

func PagerOp(pager *base.Pager) PagerOptionOp {
	return func(p *Pager) {
		if pager == nil {
			return
		}
		PageNumberOp(pager.Page)(p)
		PageSizeOp(pager.PageSize)(p)
	}
}

func PageSizeOp(size int64) PagerOptionOp {
	return func(p *Pager) {
		if size > 0 {
			p.PageSize = size
		}
	}
}

func PageNumberOp(page int64) PagerOptionOp {
	return func(p *Pager) {
		if page > 0 {
			p.Page = page
		}
	}
}

func (p *Pager) CalculateOffsetAndLimit() (offset, limit int64) {
	page := p.Page
	pageSize := p.PageSize

	limit = p.PageSize
	if page > 0 {
		page = page - 1
	}
	offset = page * pageSize
	return offset, limit
}
