package service

import (
	"context"
	"fmt"

	opv2 "github.com/pingcap/tidb-operator/api/v2/core/v1alpha1"
	corev1 "k8s.io/api/core/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type PodRestartProvider interface {
	Restart(ctx context.Context, cli client.Client, pod *corev1.Pod, force bool) error
}

func NewPodRestarter() PodRestartProvider {
	return &podRestarterV2{}
}

type podRestarterV2 struct{}

var _ PodRestartProvider = &podRestarterV2{}

func (p *podRestarterV2) Restart(ctx context.Context, cli client.Client, pod *corev1.Pod, force bool) error {
	if isDeleting(pod) {
		return nil
	}

	var (
		seconds int64
		opts    []client.DeleteOption
	)
	if pod.Labels[opv2.LabelKeyComponent] == opv2.LabelValComponentTiKV {
		// When delete a tikv pod, we have to set the grace period.
		seconds = tikvGracePeriodSeconds
	}
	if force {
		seconds = 1
	}
	if seconds > 0 {
		opts = append(opts, client.GracePeriodSeconds(seconds))
	}
	return deletePod(ctx, cli, pod, opts)
}

func deletePod(ctx context.Context, cli client.Client, pod *corev1.Pod, opts []client.DeleteOption) error {
	if err := cli.Delete(ctx, pod, opts...); err != nil {
		return fmt.Errorf("failed to delete pod %s/%s: %w", pod.Namespace, pod.Name, err)
	}
	return nil
}

func isDeleting(pod *corev1.Pod) bool {
	return pod.DeletionTimestamp != nil
}
