package managerserver

import (
	"encoding/json"
	"io"
	"net/http"
	"time"
)

const (
	defaultKillAllTimeout = 5 * time.Second
)

type assignTiDBPods struct {
	Ns       string   `json:"ns"`
	TiDBPods []string `json:"tidb-pods"`
}

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

	keyspaceName := r.URL.Query().Get("keyspace-name")
	if len(keyspaceName) == 0 {
		logger.V(2).Error(nil, "keyspace-name is required")
		http.Error(w, "keyspace-name is required", http.StatusBadRequest)
		return
	}

	NsTiDBPods := make([]assignTiDBPods, 0)

	for ns, tManager := range s.tManagers {
		if tManager == nil {
			continue
		}
		tidbPods := tManager.GetAssignedTidbByToken(keyspaceName)
		if tidbPods != nil && len(tidbPods.Endpoints) > 0 {
			NsTiDBPods = append(NsTiDBPods, assignTiDBPods{Ns: ns, TiDBPods: tidbPods.Endpoints})
			logger.Info("get assign tidb pod res", "tidb-pods", tidbPods)
		}
	}

	jsonData, err := json.Marshal(NsTiDBPods)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	_, _ = io.WriteString(w, string(jsonData))
}

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

	keyspaceName := r.URL.Query().Get("keyspace-name")
	if len(keyspaceName) == 0 {
		logger.V(2).Error(nil, "keyspace-name is required")
		http.Error(w, "keyspace-name is required", http.StatusBadRequest)
		return
	}

	for _, tManager := range s.tManagers {
		if tManager == nil {
			continue
		}
		err := tManager.KillAll(r.Context(), keyspaceName, defaultKillAllTimeout)
		if err != nil {
			http.Error(w, "kill tidb pod failed", http.StatusInternalServerError)
		}
	}

	_, _ = io.WriteString(w, "ok")
}
