package k8sresource

import (
	"github.com/tidbcloud/infra-provider/pkg/consts"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/runtime/schema"
)

const kubectlLastAppliedConfigurationAnnotation = "kubectl.kubernetes.io/last-applied-configuration"

var lastAppliedConfigurationAnnotations = []string{
	consts.LastAppliedConfigAnnotation,
	kubectlLastAppliedConfigurationAnnotation,
}

// SanitizeObjectForDetail removes server-side bookkeeping and applies GK-specific masks for detail output.
func SanitizeObjectForDetail(gvk schema.GroupVersionKind, obj *unstructured.Unstructured) {
	if obj == nil {
		return
	}
	stripLastAppliedConfigurationAnnotations(obj)
	obj.SetManagedFields(nil)
	ApplyGKMask(gvk, obj)
}

// SanitizeListForDetail sanitizes every item in a list in place.
func SanitizeListForDetail(gvk schema.GroupVersionKind, list *unstructured.UnstructuredList) {
	if list == nil {
		return
	}
	for i := range list.Items {
		SanitizeObjectForDetail(gvk, &list.Items[i])
	}
}

// SanitizeResourcesWithEventsForDetail sanitizes resource fields in event wrappers before output.
func SanitizeResourcesWithEventsForDetail(gvk schema.GroupVersionKind, wrappers []resourceWithEvents) {
	for i := range wrappers {
		if wrappers[i].Resource == nil {
			continue
		}
		SanitizeObjectForDetail(gvk, wrappers[i].Resource)
	}
}

func stripLastAppliedConfigurationAnnotations(obj *unstructured.Unstructured) {
	annotations := obj.GetAnnotations()
	if len(annotations) == 0 {
		return
	}
	for _, key := range lastAppliedConfigurationAnnotations {
		delete(annotations, key)
	}
	if len(annotations) == 0 {
		obj.SetAnnotations(nil)
		return
	}
	obj.SetAnnotations(annotations)
}
