package storage

import "gorm.io/gorm"

type Scoper interface {
	Scope(db *gorm.DB) *gorm.DB
}

type PageQuery struct {
	Page int `query:"page"`
	Size int `query:"size"`
}

func (p *PageQuery) Scope(db *gorm.DB) *gorm.DB {
	if p.Size <= 0 {
		p.Size = 10
	}

	if p.Page <= 0 {
		p.Page = 1
	}
	return db.Offset((p.Page - 1) * p.Size).Limit(p.Size)
}

type PageListQuery struct {
	Scoper
	PageQuery
}

func NewPageListQuery(scoper Scoper) *PageListQuery {
	return &PageListQuery{Scoper: scoper}
}

func (p *PageListQuery) SetPage(page int) *PageListQuery {
	p.Page = page
	return p
}

func (p *PageListQuery) SetPageSize(pageSize int) *PageListQuery {
	p.Size = pageSize
	return p
}

func (p *PageListQuery) SetScoper(scoper Scoper) *PageListQuery {
	p.Scoper = scoper
	return p
}

func (p *PageListQuery) Scope(db *gorm.DB) *gorm.DB {
	if p.Scoper != nil {
		db = p.Scoper.Scope(db)
	}
	return p.PageQuery.Scope(db)
}