package cluster

import (
	"fmt"

	"github.com/tidbcloud/infra-api/pkg/pingcap/label"
	"github.com/tidbcloud/shared-provider/pkg/utils"
	evictpod "github.com/tidbcloud/shared-provider/pkg/utils/pod"
	"go.uber.org/multierr"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

func (r *reconcileContext) handleSafeToEvictAnno() error {
	selector, err := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{
		MatchLabels: map[string]string{
			label.InstanceLabelKey: r.tcKey.Name,
		},
		MatchExpressions: []metav1.LabelSelectorRequirement{{
			Key:      label.ComponentLabelKey,
			Operator: metav1.LabelSelectorOpIn,
			Values:   evictpod.EvictComponents,
		}},
	})
	if err != nil {
		return fmt.Errorf("failed to create label selector err: %w", err)
	}

	podList := &corev1.PodList{}
	err = r.Cache.List(r.ctx, podList, &client.ListOptions{Namespace: r.tcKey.Namespace, LabelSelector: selector})
	if err != nil {
		return fmt.Errorf("failed to list pods err: %w", err)
	}

	var errs error
	duration := utils.MaxDuration(r.EvictDuration, utils.GetDetectActiveDuration(r.cluster))
	for i := 0; i < len(podList.Items); i++ {
		pod := &podList.Items[i]
		result := evictpod.NeedUpdateSafeToEvictAnno(pod, duration, r.cluster.Status.LastActiveTimestamp)
		if result != evictpod.NoUpdate {
			if err := r.updateSafeToEvictAnno(result, pod); err != nil {
				errs = multierr.Append(errs, err)
			}
		}
	}

	return errs
}

func (r *reconcileContext) updateSafeToEvictAnno(result int, pod *corev1.Pod) error {
	if result == evictpod.AddSafeToEvictAnno {
		r.Info("AddSafeToEvictAnno", "podName", pod.Name)
	} else if result == evictpod.DelSafeToEvictAnno {
		r.Info("DelSafeToEvictAnno", "podName", pod.Name)
	}
	return r.Client.Update(r.ctx, pod)
}
