package managerserver

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

	"github.com/go-logr/logr"
	"github.com/tidbcloud/aws-shared-provider/pkg/types"
	v1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/labels"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const importNamespace = "import-jobs"
const exportNamespace = "export-job"
const keyspaceNameReqKey = "keyspace-name"

type JobPods struct {
	Pods []string `json:"pods"`
}

func (s *server) getImportJobs(w http.ResponseWriter, r *http.Request) {
	logger := log.WithName("tidb/get_active_import_jobs")

	getJobPods(w, r, importNamespace, s, logger)
}

func (s *server) getExportJobs(w http.ResponseWriter, r *http.Request) {
	logger := log.WithName("tidb/get_active_export_jobs")
	getJobPods(w, r, exportNamespace, s, logger)
}

func getJobPods(w http.ResponseWriter, r *http.Request, namespace string, s *server, logger logr.Logger) {
	keyspaceName := r.URL.Query().Get(keyspaceNameReqKey)
	if len(keyspaceName) == 0 {
		logger.V(2).Error(nil, "keyspace-name is required")
		http.Error(w, "keyspace-name is required", http.StatusBadRequest)
		return
	}

	k8sClient := s.manager.GetClient()

	labelSelector := labels.SelectorFromSet(labels.Set{
		types.KeyspaceNameLabel: keyspaceName,
	})
	podList := &v1.PodList{}

	err := k8sClient.List(
		r.Context(),
		podList,
		client.InNamespace(namespace),
		client.MatchingLabelsSelector{
			Selector: labelSelector,
		},
	)
	if err != nil {
		logger.Error(err, "can not get pod list")
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	// get pod name list.
	var jobPods JobPods
	podNames := make([]string, 0)
	for _, pod := range podList.Items {
		podNames = append(podNames, pod.Name)
	}
	jobPods.Pods = podNames
	jsonData, _ := json.Marshal(jobPods)
	_, _ = io.WriteString(w, string(jsonData))
}
