package repo

import (
	privent "github.com/tidbcloud/devops/entity/privilege"
	privmod "github.com/tidbcloud/devops/models/privilege"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
)

type opts struct{}

func (opt opts) TypeIs(typ privent.PrivilegeType) repoopt.Option {
	return &repoopt.Filter[privent.PrivilegeType]{
		Column: "type",
		Value:  &typ,
	}
}

func (opt opts) PhaseIn(phases []privent.PrivilegePhase) repoopt.Option {
	return &repoopt.Filter[privent.PrivilegePhase]{
		Column: "phase",
		Values: phases,
	}
}

func (opt opts) PhaseNotIn(phases []privent.PrivilegePhase) repoopt.Option {
	return &repoopt.Filter[privent.PrivilegePhase]{
		Column:    "phase",
		ValuesNot: phases,
	}
}

func (opt opts) BindingUserHas(user string) repoopt.Option {
	// SELECT privilege_id FROM privilege_bindings WHERE user = 'xxx'
	subQuery := &repoopt.Select{
		Module: &privmod.PrivilegeBinding{},
		Select: []string{"privilege_id"},
		Filter: &repoopt.Filter[string]{
			Column: "user",
			Value:  &user,
		},
	}

	return &repoopt.FilterWithSubQuery{
		Column:   "id",
		SubQuery: subQuery,
		Values:   true,
	}
}

func (opt opts) SourceIs(src string) repoopt.Option {
	return &repoopt.Filter[string]{
		Column: "source",
		Value:  &src,
	}
}

func (opt opts) SourceLike(pattern string) repoopt.Option {
	return &repoopt.Filter[string]{
		Column: "source",
		Like:   &pattern,
	}
}

func (opt opts) WithPager(page int, perPage int) repoopt.Option {
	pager := &repoopt.Pager{
		Page:    page,
		PerPage: perPage,
	}
	return pager
}
