package dataplane

import (
	"context"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"helm.sh/helm/v3/pkg/action"
	"k8s.io/client-go/rest"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

// K8sClientManager defines a kubernetes config manager
// All k8s client and helm config should be fetched by this interface.
// Client and HelmConfig should always be fetched after rest.Config is registered, or program will be panicked.
type K8sClientManager interface {
	// Check whether config is registered
	IsRegistered(name string) bool
	// Register rest.Config so that users can get client and helm config.
	// Nothing will happen if "name" is registered multiple times.
	Register(name string, cfg *rest.Config) error

	// Deregister the name to stop client cache
	Deregister(name string)

	// Get k8s client from cache
	// It should be called after "Register"
	GetClient(name string) client.Client
	// Get helm config from cache
	// It should be called after "Register"
	GetHelmConfig(name string) *action.Configuration
	// Get rest config from cache
	// It should be called after "Register"
	GetRestConfig(name string) *rest.Config
}

// EnvProvider defines a cluster env provider
// It is defined to get the kubernetes env for TiDB Cluster
type EnvProvider interface {
	GetClient() client.Client
	GetHelmConfig() *action.Configuration
	GetRestConfig() *rest.Config
	GetRegion() string

	GetClusterName() string
	GetClusterEndpoint() string
	GetClusterCA() []byte

	GetAccount() string
	GetNetwork() string

	AWS() AWSInterface
	GCP() GCPInterface
}

type EnvProviderManager interface {
	GetClient(context.Context, *cloudv1.Cluster) (client.Client, error)
	GetEnvProvider(context.Context, *cloudv1.Cluster) (EnvProvider, error)
	Deregister(context.Context, *cloudv1.Cluster)
}

type AWSInterface interface {
	GetEKSSecurityGroup() string
	// get subnets for eks nodes by zone
	GetNodeSubnets(zones ...string) []string
}

type GCPInterface interface {
}
