package clusterconfig

import (
	"context"

	configcenter "github.com/tidbcloud/config-center/proto/config_center"
	regionaldedicatedv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"

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

//go:generate go run go.uber.org/mock/mockgen@latest -source=$GOFILE -package=mock_$GOPACKAGE -destination=./mock_$GOPACKAGE/mock_$GOFILE
type Client interface {
	GetClusterVersion(ctx context.Context, cluster *entity.Cluster) (string, bizerr.BizError)
	CreateClusterMeta(ctx context.Context, cluster *entity.Cluster) (string, bizerr.BizError)
	GetClusterComponentsVersion(
		ctx context.Context,
		cluster *entity.Cluster,
	) (*regionaldedicatedv1.ClusterVersion, bizerr.BizError)
	ListComponentConfigurations(
		ctx context.Context,
		cluster *entity.Cluster,
	) ([]*regionaldedicatedv1.ComponentConfiguration, bizerr.BizError)
	GetCustomClusterConfiguration(
		ctx context.Context,
		cluster *entity.Cluster,
	) (*entity.ClusterConfiguration, bizerr.BizError)
	GetClusterInitSqlStmts(ctx context.Context, cluster *entity.Cluster) (string, bizerr.BizError)
	CreateOrUpdateComponentConfiguration(
		ctx context.Context,
		cluster *entity.Cluster,
		component *entity.ClusterComponent,
	) ([]*regionaldedicatedv1.ComponentConfiguration, bizerr.BizError) // tiflash will hava two configurations
	CreateOrUpdateComponentVersion(
		ctx context.Context,
		cluster *entity.Cluster,
		component *entity.ClusterComponent,
	) (*regionaldedicatedv1.ClusterVersion_ComponentVersion, bizerr.BizError)

	// apply cluster
	GetClusterComponentVersion(
		ctx context.Context,
		cluster *entity.Cluster,
		componentType entity.ComponentType,
	) (*regionaldedicatedv1.ClusterVersion_ComponentVersion, bizerr.BizError)
	GetComponentConfiguration(
		ctx context.Context,
		cluster *entity.Cluster,
		componentType entity.ComponentType,
	) (*regionaldedicatedv1.ComponentConfiguration, bizerr.BizError)

	// update cluster component configurations
	// Custom parameters are upserted without overwriting any other existing parameters.
	UpdateClusterComponentConfigurations(
		ctx context.Context,
		cluster *entity.Cluster,
		clusterConfiguration *entity.ClusterConfiguration,
	) bizerr.BizError

	// overwrite cluster component configurations
	// Custom parameters are overwritten entirely.
	// If a component_type configuration is specified and CustomParams field is empty, it means to clear all custom
	// parameters for that component_type.
	OverwriteClusterComponentConfigurations(
		ctx context.Context,
		cluster *entity.Cluster,
		clusterConfiguration *entity.ClusterConfiguration,
	) bizerr.BizError

	// tiproxy
	GetTiproxyVersion(ctx context.Context, cluster *entity.Cluster) (string, bizerr.BizError)

	UpdateClusterMeta(ctx context.Context, req *configcenter.AutoUpdateClusterMetaRequest) bizerr.BizError
	DeleteClusterMeta(ctx context.Context, cluster *entity.Cluster) bizerr.BizError
}
