package pod

import (
	"context"
	"time"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/shared-provider/pkg/utils"
	evictpod "github.com/tidbcloud/shared-provider/pkg/utils/pod"
	corev1 "k8s.io/api/core/v1"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"k8s.io/client-go/util/retry"
	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/log"
)

func (r *Reconciler) handleSafeToEvictAnno(
	ctx context.Context, pod *corev1.Pod, cluster *cloudv1.Cluster) (ctrl.Result, error) {
	logger := log.FromContext(ctx)
	logger.Info("Start reconcile pod")

	startTime := time.Now()
	defer func() {
		logger.Info("Finish reconcile pod", "time", time.Since(startTime))
	}()

	duration := utils.MaxDuration(r.EvictDuration, utils.GetDetectActiveDuration(cluster))
	err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
		var err error
		result := evictpod.NeedUpdateSafeToEvictAnno(pod, duration, cluster.Status.LastActiveTimestamp)
		if result != evictpod.NoUpdate {
			if result == evictpod.AddSafeToEvictAnno {
				logger.Info("AddSafeToEvictAnno", "podName", pod.Name)
			} else if result == evictpod.DelSafeToEvictAnno {
				logger.Info("DelSafeToEvictAnno", "podName", pod.Name)
			}
			if err = r.Client.Update(ctx, pod); err != nil && apierrors.IsConflict(err) {
				if err := r.Client.Get(ctx, client.ObjectKeyFromObject(pod), pod); err != nil {
					return err
				}
			}
		}
		return err
	})

	return ctrl.Result{}, err
}
