package gkeheterogeneous

import (
	"strings"

	gkev1beta1 "github.com/crossplane-contrib/provider-gcp/apis/container/v1beta1"
	"github.com/pingcap/errors"

	"github.com/tidbcloud/infra-provider/pkg/consts"
	nodepoolutil "github.com/tidbcloud/infra-provider/pkg/nodepool"
)

func IsAPIManagedNodePool(nodePool *gkev1beta1.NodePool) bool {
	if nodePool == nil {
		return false
	}
	return nodePool.GetLabels()[consts.GKEHeterogeneousNodePoolManagedByLabelKey] == consts.GKEHeterogeneousNodePoolManagedByLabelValue
}

func NodePoolMachineType(nodePool *gkev1beta1.NodePool) (string, bool) {
	if nodePool == nil || nodePool.Spec.ForProvider.Config == nil || nodePool.Spec.ForProvider.Config.MachineType == nil {
		return "", false
	}
	return strings.TrimSpace(*nodePool.Spec.ForProvider.Config.MachineType), true
}

func NodePoolClusterRef(nodePool *gkev1beta1.NodePool) string {
	if nodePool == nil {
		return ""
	}
	return strings.TrimSpace(nodePool.Spec.ForProvider.Cluster)
}

func NodePoolComputeClass(nodePool *gkev1beta1.NodePool) string {
	return strings.TrimSpace(nodepoolutil.GKEComputeClassNameForNodePool(nodePool))
}

func ValidateNodePoolScopeLabels(nodePool *gkev1beta1.NodePool, clusterName, scopeDescription string, expectedLabels map[string]string) error {
	if nodePool == nil {
		return errors.Errorf("gke nodepool is nil")
	}

	labels := nodePool.GetLabels()
	for key, expected := range expectedLabels {
		if actual := strings.TrimSpace(labels[key]); actual != expected {
			return errors.Errorf(
				"nodepool %s does not belong to cluster %s %s: label %s=%q, want %q",
				nodePool.GetName(),
				strings.TrimSpace(clusterName),
				strings.TrimSpace(scopeDescription),
				key,
				actual,
				expected,
			)
		}
	}
	return nil
}
