package repo

import (
	"fmt"
	"strings"

	ubent "github.com/tidbcloud/devops/entity/userbehavior"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
)

var (
	SubscriptionOpts sOpts
	LarkChatOpts     lcOpts
)

type sOpts struct{}

func (_ sOpts) LikeEmail(email string) repoopt.Option {
	likeEmail := fmt.Sprintf("%%%s%%", strings.ToLower(email))
	return &repoopt.Filter[string]{
		Column: "email",
		Like:   &likeEmail,
	}
}

func (_ sOpts) OnlyAvailable() repoopt.Option {
	available := true
	return &repoopt.Filter[bool]{
		Column: "available",
		Value:  &available,
	}
}

func (_ sOpts) WithPager(page int, perPage int, defaultOrder bool) repoopt.Option {
	pager := &repoopt.Pager{
		Page:    page,
		PerPage: perPage,
	}
	if !defaultOrder {
		return pager
	}

	order := &repoopt.Order{
		Column: "created_at",
		Desc:   true,
	}
	return repoopt.Aggregate(pager, order)
}

func (_ sOpts) ByEmail(email string) repoopt.Option {
	return &repoopt.Filter[string]{
		Column: "email",
		Value:  &email,
	}
}

func (_ sOpts) IsUBEvent(eventTp ubent.UBEventTp) repoopt.Option {
	eventTpString := string(eventTp)
	return &repoopt.Filter[string]{
		Column: "event_type",
		Value:  &eventTpString,
	}
}

func (_ sOpts) DefaultOrder() repoopt.Option {
	return &repoopt.Order{
		Column: "created_at",
		Desc:   true,
	}
}

type lcOpts struct{}

func (_ lcOpts) WithPager(page int, perPage int, defaultOrder bool) repoopt.Option {
	pager := &repoopt.Pager{
		Page:    page,
		PerPage: perPage,
	}
	if !defaultOrder {
		return pager
	}

	order := &repoopt.Order{
		Column: "create_at",
		Desc:   false,
	}
	return repoopt.Aggregate(pager, order)
}

func (_ lcOpts) InIds(ids []uint64) repoopt.Option {
	inIds := &repoopt.Filter[uint64]{
		Column: "id",
		Values: ids,
	}

	order := &repoopt.Order{
		Column: "id",
		Desc:   false,
	}

	return repoopt.Aggregate(inIds, order)
}
