package infra

import (
	"context"

	"github.com/tidbcloud/pkgv2/clusterproxy"

	"github.com/tidbcloud/account/internel/dao/entity"

	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
)

type InfraHandler interface {
	CleanClusters(ctx context.Context, tenantID uint64, disableFinalBackup bool) error
	CleanFreeClusters(ctx context.Context, tenantID uint64, disableFinalBackup bool) error
	CleanProjectResource(ctx context.Context, projectID uint64) error
	CleanTenantResource(ctx context.Context, tenantID uint64) error
	GetProjectClustersInStatus(ctx context.Context, projectID uint64, status ...core.ClusterStatus) ([]*core.Cluster, error)
	GetOrgClusterSupportDbUser(ctx context.Context, orgID uint64) ([]*core.Cluster, error)
	GetProjectClustersNotInStatus(ctx context.Context, projectID uint64, status ...core.ClusterStatus) ([]*core.Cluster, error)
	GetProjectClusterSupportDbUser(ctx context.Context, projectIds []uint64) ([]*core.Cluster, error)
	GetNormalStatusClusters(ctx context.Context, orgID uint64, projectIds []uint64) ([]*core.Cluster, error)
	GetClusterById(ctx context.Context, clusterId uint64, useCache bool, status ...core.ClusterStatus) (*core.Cluster, error)
	IsDedicatedCluster(ctx context.Context, clusterId uint64) (bool, error)
	CreateDBUser(ctx context.Context, clusterId uint64, OperatorUserName string, operatorAuthMethod clusterproxy.AuthMethod, jwtToken string, userEmail string, dbUser string, ignoreExists bool, command *entity.CommandDBUserCluster, dbRole string) entity.CommandStatus
	DeleteDBUser(ctx context.Context, clusterId uint64, OperatorUserName string, jwtToken string, username string, command *entity.CommandDBUserCluster) entity.CommandStatus
	SetClusterAuthPubKey(ctx context.Context, clusterId uint64, keys string) entity.CommandStatus
	CreateCluster(ctx context.Context, req *core.CreateClusterReq) (*uint64, error)
	GetServerlessDefaultRegion(ctx context.Context, provider string, orgId uint64, projectId uint64, clientIP string) (*string, error)
	DBUserISExisting(ctx context.Context, clusterId uint64, OperatorUserName string, jwtToken string, dbUser string) (bool, entity.CommandStatus)
	CountClustersByProject(ctx context.Context, projectIds []uint64) (int64, error)
	CountClustersByOrg(ctx context.Context, projectIds []uint64) (int64, error)
	CreateGeneralDBUser(ctx context.Context, req *core.CreateDBUserReq, checkCloudBuiltinRole string) error
	UpdateSqlUser(ctx context.Context, req *core.UpdateDBUserReq, cloudBuiltinRole string) error
	ListSqlUser(ctx context.Context, req *core.ListDBUsersReq) (*core.ListDBUsersResp, error)
	DeleteSqlUser(ctx context.Context, operator *core.DBUserOperator, dbUser string, clusterId uint64) error
	GetClusterConfidentialInfo(ctx context.Context, req *core.GetClusterConfidentialInfoReq) (*core.GetClusterConfidentialInfoResp, error)
	CountClusters(ctx context.Context, filter *core.ClusterFilter) (int64, error)
	CountNetworkPeers(ctx context.Context, filter *core.NetworkPeerFilter) (int64, error)
}

var global InfraHandler = &InfraHandlerImpl{}

func GetHandler() InfraHandler {
	return global
}

func SetHandler(handler InfraHandler) {
	global = handler
}
