package cluster

import (
	"context"
	"time"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

type Filter struct {
	CloudProviderNames              []entity.CloudProviderName
	RegionNames                     []entity.RegionName
	LogicalRegionNames              []string
	States                          []entity.State
	ExcludeStates                   []entity.State
	OrganizationIds                 []uint64
	ProjectIds                      []uint64
	ClusterIds                      []uint64
	CmekIds                         []uint64
	ShowDeleted                     bool
	HasCustomerManagedEncryptionKey *bool // nil = no filter, true = has CMEK, false = no CMEK
}

//go:generate go run go.uber.org/mock/mockgen@latest -source=$GOFILE -package=mock_$GOPACKAGE -destination=./mock_$GOPACKAGE/mock_$GOFILE
type Repo interface {
	Save(ctx context.Context, cluster *entity.Cluster) bizerr.BizError
	Delete(ctx context.Context, cluster *entity.Cluster) bizerr.BizError
	Query(ctx context.Context, filter *Filter) ([]*entity.Cluster, bizerr.BizError)
	QueryAndLoadComponents(ctx context.Context, filter *Filter) ([]*entity.Cluster, bizerr.BizError)
	Get(ctx context.Context, clusterId uint64, showDeleted bool) (*entity.Cluster, bizerr.BizError)
	GetAndLoadComponents(ctx context.Context, clusterId uint64) (*entity.Cluster, bizerr.BizError)
	SetEncryptedRootPassword(ctx context.Context, clusterId uint64, rootPassword string) bizerr.BizError
	GetEncryptedRootPassword(ctx context.Context, clusterId uint64) (string, bizerr.BizError)
	GetBillableClustersCount(
		ctx context.Context,
		projectID uint64,
		startTime, endTime time.Time,
	) (uint32, bizerr.BizError)
}
