package managerserver

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"
	"strings"
)

const (
	updatePoolCreateRateParam = "create-rate-per-second"
)

type updatePoolCreateRateResult struct {
	CreateRatePerSecond float64 `json:"create_rate_per_second"`
}

func (s *server) updateKeyspacePoolCreateRate(w http.ResponseWriter, r *http.Request) {
	logger := log.WithName("keyspace/update_pool_create_rate")
	if r.Method != http.MethodPost {
		w.WriteHeader(http.StatusMethodNotAllowed)
		return
	}
	if s.createRateStore == nil {
		http.Error(w, "create rate store is not configured", http.StatusInternalServerError)
		return
	}

	value := strings.TrimSpace(r.URL.Query().Get(updatePoolCreateRateParam))
	if value == "" {
		http.Error(w, fmt.Sprintf("query parameter %q is required", updatePoolCreateRateParam), http.StatusBadRequest)
		return
	}
	createRatePerSecond, err := strconv.ParseFloat(value, 64)
	if err != nil || createRatePerSecond < 0 {
		http.Error(w, fmt.Sprintf("query parameter %q must be a float greater than or equal to 0", updatePoolCreateRateParam),
			http.StatusBadRequest)
		return
	}

	s.createRateStore.Set(createRatePerSecond)

	w.Header().Set("Content-Type", "application/json")
	_ = json.NewEncoder(w).Encode(updatePoolCreateRateResult{
		CreateRatePerSecond: createRatePerSecond,
	})
	logger.Info("updated keyspace pool create rate", "create-rate-per-second", createRatePerSecond)
}
