package providerconfig

import (
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/consts"
	"github.com/tidbcloud/infra-provider/pkg/namer"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func GetClusterProviderConfigNameFromCluster(cluster *cloudv1.Cluster) string {
	isLegacyCluster := func(cluster *cloudv1.Cluster) bool {
		return cluster.Spec.NetworkName != ""
	}

	// refer to controllers/cluster/task/context.go
	// AWS use cluster-level providerconfig
	// GCP use dataplane-level providerconfig
	switch providerType := cluster.GetProviderType(); providerType {
	case consts.ProviderTypeEKS:
		// AWS
		if isLegacyCluster(cluster) {
			// the provider config name is the same as the EKS cluster name
			return cluster.Spec.Kubernetes.Name
		}
		// pc-{ns-cluster}-{hash}
		return namer.NewName(cluster.ClusterScopeName(), "pc", "", -1)
	case consts.ProviderTypeGKE:
		// GCP
		if isLegacyCluster(cluster) {
			return namer.UniqueIdentifier(metav1.ObjectMeta{
				// e.g. gke-us-west-2, network CR name
				Name:      cluster.GetProviderType() + "-" + cluster.GetRegion(),
				Namespace: cluster.Namespace,
			})
		}

		// pc-{k8s-name}-{hash}
		// all resources in the same GKE share the same provider config
		return namer.NewName(cluster.Spec.Kubernetes.Name, "pc", "", -1)
	case consts.ProviderTypeAKS:
		// TODO(ideascf): Return the dataplane ProviderConfig (pc-dp-*) after existing pc-* usages are migrated.
		// Azure
		// pc-{k8s-name}-{hash}
		// all resources in the same AKS share the same provider config
		return namer.NewName(cluster.Spec.Kubernetes.Name, "pc", "", -1)
	}

	return ""
}
