rendermembers.gno

package memberstore

import (
	"net/url"
	"strings"

	"gno.land/p/moul/md"
	"gno.land/p/nt/avl/v0"
	"gno.land/p/nt/avl/v0/pager"
	"gno.land/p/nt/ufmt/v0"
	"gno.land/p/samcrew/tablesort"
	"gno.land/p/samcrew/urlfilter"
)

// RenderMembers returns the members list with tier filters and pagination.
func RenderMembers(path string, members MembersByTier) string {
	u, _ := url.Parse(path)
	mdFilters, items := urlfilter.ApplyFilters(u, members.Tree, "filter")
	var sb strings.Builder

	sb.WriteString(md.Link("> Go to Tiers summary <", "/r/gov/dao/v3/memberstore") + "\n\n")
	sb.WriteString(md.Bold("Filter members by tiers:"))
	sb.WriteString(mdFilters + "\n")

	const pageSize = 14
	pager := pager.NewPager(items, pageSize, false)
	page := pager.MustGetPageByPath(path)

	sb.WriteString(renderMembersPages(u, page, items) + "\n")
	sb.WriteString(renderPagination(u, page))

	return sb.String()
}

// renderMembersPages returns the members of each page.
func renderMembersPages(u *url.URL, page *pager.Page, members *avl.Tree) string {
	var sb strings.Builder

	table := &tablesort.Table{
		Headings: []string{"Tier", "Address"},
		Rows:     [][]string{},
	}

	for _, item := range page.Items {
		addr := item.Key
		tn, _ := members.Get(addr)
		tnStr, _ := tn.(string)
		tierCell := ufmt.Sprintf("%s %s", tierColoredChip(tnStr), tn)
		table.Rows = append(table.Rows, []string{tierCell, addr})
	}

	sb.WriteString(tablesort.Render(u, table, ""))

	return sb.String()
}

// renderPagination returns the pagination UI for the current page.
func renderPagination(u *url.URL, page *pager.Page) string {
	q := u.Query()
	q.Del("page")
	u.RawQuery = q.Encode()

	var sb strings.Builder
	sb.WriteString(page.Picker(u.String()))

	return sb.String()
}