package tidbmanager

import (
	"context"
	"fmt"

	"github.com/go-logr/logr"
	"github.com/tidbcloud/aws-shared-provider/pkg/types"
	"github.com/tidbcloud/aws-shared-provider/pkg/utils/endpoint"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	apitypes "k8s.io/apimachinery/pkg/types"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

func (t *tidbManager) unpatchCriticalTidbPod(ctx context.Context, log logr.Logger, name string) {
	logger := log.WithName("unpatchCriticalTidbPod").WithValues("pod name", name, "pool", t.tidbPoolNamespace)
	serverlessPoolConfigCm := &corev1.ConfigMap{}
	if err := t.client.Get(ctx, client.ObjectKey{
		Name:      types.ServerlessPoolConfig,
		Namespace: t.tidbPoolNamespace,
	}, serverlessPoolConfigCm); err != nil {
		logger.Error(err, "get cm serverlessPoolConfig")
		return
	}
	if serverlessPoolConfigCm.Data[types.TidbCriticalKey] == "true" {
		logger.Info("unpatching critical tidb pod")
		data := fmt.Sprintf(`{"metadata":{"annotations":{"%s":null}}}`, t.safeToEvict)
		if err := t.client.Patch(ctx, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: t.tidbPoolNamespace,
		}}, client.RawPatch(apitypes.StrategicMergePatchType, []byte(data))); err != nil {
			logger.Error(err, "unpatch critical tidb pod")
			return
		}
	}
}

func (t *tidbManager) FreeTidb(ctx context.Context, podName, podIP, comment string) error {
	t.Info("[pod lifecycle] free tidb pod", "pod_name", podName, "pod_ip", podIP, "comment", comment)
	t.unpatchCriticalTidbPod(ctx, t.Logger, podName)
	return t.removeEndpoint(ctx, endpoint.GenEndpointFromPod(podName, podIP), comment)
}
