package managerserver

import (
	"context"
	"errors"
	"io"
	"net/http"

	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

func (s *server) replace(w http.ResponseWriter, r *http.Request) {
	logger := log.WithName("tidb/replace")
	logger.V(2).Info("req param", "req", r.URL)

	var err error
	defer func() {
		if err != nil {
			w.WriteHeader(http.StatusInternalServerError)
			_, _ = io.WriteString(w, err.Error())
			return
		}
		_, _ = io.WriteString(w, "ok")
	}()

	podName := r.URL.Query().Get("pod")
	if podName == "" {
		logger.Error(nil, "pod is required")
		err = errors.New("pod is required")
		return
	}

	ns := r.URL.Query().Get("ns")
	if ns == "" {
		logger.Error(nil, "ns is required")
		err = errors.New("ns is required")
		return
	}

	tManager := s.tManagers[ns]
	if tManager == nil {
		logger.Error(nil, "tidb manager not found for namespace", "ns", ns)
		err = errors.New("tidb manager not found for namespace")
		return
	}

	logger.Info("start to replace tidb", "podName", podName, "ns", ns)
	err = tManager.ReplaceTidb(r.Context(), podName, s.deletePod)
	if err != nil {
		logger.Error(err, "replace tidb error")
	}
}

func (s *server) deletePod(ctx context.Context, podName, ns string) error {
	return client.IgnoreNotFound(s.manager.GetClient().Delete(ctx, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{
		Name:      podName,
		Namespace: ns,
	}}))
}
