package utils

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/labels"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/namer"
)

func IsPaused(o metav1.Object) bool {
	return o.GetAnnotations()[v1alpha1.AnnotationKeyReconciliationPaused] == "true"
}

func Pause(o metav1.Object) {
	anno := o.GetAnnotations()
	if anno == nil {
		anno = map[string]string{}
	}
	anno[v1alpha1.AnnotationKeyReconciliationPaused] = "true"
	o.SetAnnotations(anno)
}

func Unpause(o metav1.Object) {
	anno := o.GetAnnotations()
	if anno == nil {
		return
	}
	delete(anno, v1alpha1.AnnotationKeyReconciliationPaused)
	o.SetAnnotations(anno)
}

func GetAdminNodesLabelSelector(appBox *v1alpha1.APPBox) client.MatchingLabelsSelector {
	ls := client.MatchingLabelsSelector{
		Selector: labels.SelectorFromSet(map[string]string{
			namer.LegacyNetworkNamespaceSelectorKey: appBox.Namespace,
			namer.AppBoxSelectorKey:                 appBox.Name,
		}),
	}
	return ls
}

// GetNodePoolsLabelSelector returns the label selector to
// select all node nodepools (including admin and worker node pools) for the given dataplane ID.
func GetNodePoolsLabelSelector(dataplaneId string) client.MatchingLabelsSelector {
	ls := client.MatchingLabelsSelector{
		Selector: labels.SelectorFromSet(map[string]string{
			v1alpha1.DataPlaneIDKey: dataplaneId,
		}),
	}
	return ls
}

// GetAddonsLabelSelector returns the label selector to select all addons for the given APPBox.
func GetAddonsLabelSelector(appBox *v1alpha1.APPBox) client.MatchingLabelsSelector {
	ls := client.MatchingLabelsSelector{
		Selector: labels.SelectorFromSet(map[string]string{
			namer.LegacyNetworkNamespaceSelectorKey: appBox.Namespace,
			namer.AppBoxSelectorKey:                 appBox.Name,
		}),
	}
	return ls
}
