package controllers

import (
	"reflect"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"sigs.k8s.io/controller-runtime/pkg/event"
	"sigs.k8s.io/controller-runtime/pkg/predicate"
)

// AnnotationChangedPredicate is a predicate that filters out resources that have the skip some annotation.
type AnnotationChangedPredicate struct {
	predicate.Funcs
}

// Update implements UpdateEvent filter for validating annotation change.
func (AnnotationChangedPredicate) Update(e event.UpdateEvent) bool {
	if e.ObjectOld == nil {
		return false
	}
	if e.ObjectNew == nil {
		return false
	}

	oldAnnotations := deepCopy(e.ObjectOld.GetAnnotations())
	newAnnotations := deepCopy(e.ObjectNew.GetAnnotations())

	// skip gc related annotations
	delete(oldAnnotations, v1alpha1.AnnotationKeyIdelStartTime)
	delete(oldAnnotations, v1alpha1.AnnotationKeyReadyForDeleteStartTime)
	delete(oldAnnotations, v1alpha1.SkipGCAnnotationKey)

	delete(newAnnotations, v1alpha1.AnnotationKeyIdelStartTime)
	delete(newAnnotations, v1alpha1.AnnotationKeyReadyForDeleteStartTime)
	delete(newAnnotations, v1alpha1.SkipGCAnnotationKey)

	return !reflect.DeepEqual(oldAnnotations, newAnnotations)
}

func deepCopy(m map[string]string) map[string]string {
	result := map[string]string{}
	for k, v := range m {
		result[k] = v
	}
	return result
}
