package opsapi

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/observability/pkg/common/message"
	"github.com/tidbcloud/observability/pkg/opsservice"
	"github.com/tidbcloud/observability/pkg/regionalapi/apiinterceptor"
)

// CreateVMCluster
// @Summary deploy victoriametrics cluster
// @Description Deploys a new VictoriaMetrics cluster by creating a new Helm release
// @Tags vmcluster
// @Accept json
// @Produce json
// @Param request body message.CreateVMClusterReq true "create VM cluster request"
// @Success 202 {object} message.Result{data=message.CreateVMClusterResp}
// @Failure 400 {object} message.Result
// @Failure 409 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /vmclusters [post]
func CreateVMCluster(c *gin.Context) {
	req := &message.CreateVMClusterReq{}
	if ok := apiinterceptor.HandleJsonRequestFromBody(c, req); ok {
		resp, err := opsservice.GetVMClusterService().CreateVMCluster(c, *req)
		if err != nil {
			apiinterceptor.Fail(c, err)
		} else {
			apiinterceptor.Succeed(c, http.StatusAccepted, resp)
		}
	}
}

// ListVMClusters
// @Summary List VM Clusters
// @Description Lists all deployed VictoriaMetrics clusters managed by the Ops API Server
// @Tags vmcluster
// @Accept json
// @Produce json
// @Param request query message.ListVMClustersReq true "list VM clusters request"
// @Success 200 {object} message.Result{data=message.ListVMClustersResp}
// @Failure 500 {object} message.Result
// @Router /vmclusters [get]
func ListVMClusters(c *gin.Context) {
	req := &message.ListVMClustersReq{}
	if ok := apiinterceptor.HandleJsonRequestFromQuery(c, req); ok {
		resp, err := opsservice.GetVMClusterService().ListVMClusters(c, *req)
		if err != nil {
			apiinterceptor.Fail(c, err)
		} else {
			apiinterceptor.Succeed(c, http.StatusOK, resp)
		}
	}
}

// GetVMCluster
// @Summary get VM cluster details
// @Description Retrieves the details of a specific VictoriaMetrics cluster
// @Tags vmcluster
// @Accept json
// @Produce json
// @Param vmclusterId path string true "VM cluster ID"
// @Success 200 {object} message.Result{data=message.GetVMClusterResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /vmclusters/{vmclusterId} [get]
func GetVMCluster(c *gin.Context) {
	req := &message.GetVMClusterReq{
		ID: c.Param("vmclusterId"),
	}

	if ok := apiinterceptor.HandleJsonRequestFromQuery(c, req); ok {
		resp, err := opsservice.GetVMClusterService().GetVMCluster(c, *req)
		if err != nil {
			apiinterceptor.Fail(c, err)
		} else {
			apiinterceptor.Succeed(c, http.StatusOK, resp)
		}
	}
}

// UpdateVMCluster
// @Summary change vm cluster
// @Description Updates the configuration of an existing VictoriaMetrics cluster by performing a Helm upgrade
// @Tags vmcluster
// @Accept json
// @Produce json
// @Param vmclusterId path string true "VM cluster ID"
// @Param request body message.UpdateVMClusterReq true "update VM cluster request"
// @Success 202 {object} message.Result{data=message.UpdateVMClusterResp}
// @Failure 400 {object} message.Result
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /vmclusters/{vmclusterId} [put]
func UpdateVMCluster(c *gin.Context) {
	req := &message.UpdateVMClusterReq{
		ID: c.Param("vmclusterId"),
	}

	if ok := apiinterceptor.HandleJsonRequestFromBody(c, req); ok {
		resp, err := opsservice.GetVMClusterService().UpdateVMCluster(c, *req)
		if err != nil {
			apiinterceptor.Fail(c, err)
		} else {
			apiinterceptor.Succeed(c, http.StatusAccepted, resp)
		}
	}
}

// DeleteVMCluster
// @Summary Uninstall the VM cluster
// @Description Deletes a VictoriaMetrics cluster by uninstalling the associated Helm release
// @Tags vmcluster
// @Accept json
// @Produce json
// @Param vmclusterId path string true "VM cluster ID"
// @Success 202 {object} message.Result{data=message.DeleteVMClusterResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /vmclusters/{vmclusterId} [delete]
func DeleteVMCluster(c *gin.Context) {
	req := &message.DeleteVMClusterReq{
		ID: c.Param("vmclusterId"),
	}

	if ok := apiinterceptor.HandleJsonRequestFromQuery(c, req); ok {
		resp, err := opsservice.GetVMClusterService().DeleteVMCluster(c, *req)
		if err != nil {
			apiinterceptor.Fail(c, err)
		} else {
			apiinterceptor.Succeed(c, http.StatusAccepted, resp)
		}
	}
}
