package tg

type Rowser interface {
	MakeRows(c Context) []ButtonRow
}

type RowserFunc func(c Context) []ButtonRow
func (fn RowserFunc) MakeRows(c Context) []ButtonRow {
	return fn(c)
}

// The type represents the inline panel with
// scrollable via buttons content.
// Can be used for example to show users via SQL and offset
// or something like that.
type PanelCompo struct {
	InlineCompo
	Rowser Rowser
}

// Transform to the panel with dynamic rows.
func (compo *MessageCompo) Panel(
	c Context, // The context to generate the first page of buttons.
	rowser Rowser, // The rows generator.
) *PanelCompo {
	ret := &PanelCompo{}
	ret.InlineCompo = (*compo.Inline(
		NewKeyboard(
			rowser.MakeRows(c)...,
		).Inline(),
	))
	ret.Rowser = rowser
	return ret
}

func (compo *PanelCompo) Update(c Context) {
	compo.Rows = compo.Rowser.MakeRows(c)
	compo.InlineCompo.Update(c)
}