package serverlessglobal

import (
	"context"

	"google.golang.org/grpc"
	"google.golang.org/protobuf/types/known/emptypb"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/serverless/v1"
)

type ServerlessGlobal interface {
	CreateCluster(
		ctx context.Context,
		in *globalserverlessv1.ServerlessServiceCreateRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ServerlessServiceCreateResponse, error)
	ListClusters(
		ctx context.Context,
		in *globalserverlessv1.ServerlessServiceListRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ServerlessServiceListResponse, error)
	CountClusters(
		ctx context.Context,
		in *globalserverlessv1.ServerlessServiceCountClustersRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ServerlessServiceCountClustersResponse, error)
	DeleteCluster(
		ctx context.Context,
		in *globalserverlessv1.ServerlessServiceDeleteRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ServerlessServiceDeleteResponse, error)
	UpdateCluster(
		ctx context.Context,
		in *globalserverlessv1.ServerlessServiceUpdateRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ServerlessServiceUpdateResponse, error)
	ChangeSqlUserPasswd(
		ctx context.Context,
		in *globalserverlessv1.ChangeSqlUserPasswdRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ChangeSqlUserPasswdResponse, error)
	RotateRootPassword(
		ctx context.Context,
		in *globalserverlessv1.RotateRootPasswordRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.RotateRootPasswordResponse, error)
	RedeemRootPassword(
		ctx context.Context,
		in *globalserverlessv1.RedeemRootPasswordRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.RedeemRootPasswordResponse, error)
	CreatePGBackup(
		ctx context.Context,
		in *globalserverlessv1.CreatePGBackupRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.CreatePGBackupResponse, error)
	ListPGBackups(
		ctx context.Context,
		in *globalserverlessv1.ListPGBackupsRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.ListPGBackupsResponse, error)
	GetPGBackup(
		ctx context.Context,
		in *globalserverlessv1.GetPGBackupRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.GetPGBackupResponse, error)
	GetPGBackupPolicy(
		ctx context.Context,
		in *globalserverlessv1.GetPGBackupPolicyRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.GetPGBackupPolicyResponse, error)
	UpdatePGBackupPolicy(
		ctx context.Context,
		in *globalserverlessv1.UpdatePGBackupPolicyRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.UpdatePGBackupPolicyResponse, error)

	RegisterCloudProvider(
		ctx context.Context,
		in *globalserverlessv1.CloudProviderServiceRegisterRequest,
		opts ...grpc.CallOption,
	) (*globalcommonv1.CloudProvider, error)
	ListCloudProviders(
		ctx context.Context,
		in *globalserverlessv1.CloudProviderServiceListRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.CloudProviderServiceListResponse, error)
	ListRegions(
		ctx context.Context,
		in *globalserverlessv1.RegionServiceListRequest,
		opts ...grpc.CallOption,
	) (*globalserverlessv1.RegionServiceListResponse, error)
	GetRegion(
		ctx context.Context,
		in *globalserverlessv1.RegionServiceGetRequest,
		opts ...grpc.CallOption,
	) (*globalcommonv1.Region, error)
	RegisterRegion(
		ctx context.Context,
		in *globalserverlessv1.RegionServiceRegisterRequest,
		opts ...grpc.CallOption,
	) (*globalcommonv1.Region, error)
	UpdateRegion(
		ctx context.Context,
		in *globalserverlessv1.RegionServiceUpdateRequest,
		opts ...grpc.CallOption,
	) (*globalcommonv1.Region, error)
	DeleteRegion(
		ctx context.Context,
		in *globalserverlessv1.RegionServiceDeleteRequest,
		opts ...grpc.CallOption,
	) (*emptypb.Empty, error)

	CreateDataMigrationTask(
		ctx context.Context,
		taskId string,
		sourceDsn string,
		targetDsn string) error

	CheckDataMigrationTask(
		ctx context.Context,
		taskId string) (bool, error)
}
