package labels

import (
	"strings"

	"k8s.io/apimachinery/pkg/runtime/schema"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
	// KeyPrefix defines prefix of label and annotation key.
	KeyPrefix = "infra.tidbcloud.com/"

	LabelKeyUID       = KeyPrefix + "uid"
	LabelKeyOwnedBy   = KeyPrefix + "owned-by"
	LabelKeyNamespace = KeyPrefix + "namespace"
	LabelKeyName      = KeyPrefix + "name"
)

func GVKString(gvk *schema.GroupVersionKind) string {
	if len(gvk.Group) > 0 {
		return gvk.Group + "." + gvk.Version + "." + strings.ToLower(gvk.Kind)
	}

	return gvk.Version + "." + strings.ToLower(gvk.Kind)
}

func NewOwnerLabels(owner client.Object, labels map[string]string) map[string]string {
	gvk := owner.GetObjectKind().GroupVersionKind()
	namespace := owner.GetNamespace()
	name := owner.GetName()
	uid := string(owner.GetUID())

	if labels == nil {
		labels = map[string]string{}
	}

	labels[LabelKeyOwnedBy] = GVKString(&gvk)
	labels[LabelKeyNamespace] = namespace
	labels[LabelKeyName] = name
	labels[LabelKeyUID] = uid

	return labels
}
