package globalapi

import "github.com/gin-gonic/gin"

// 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) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// 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) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// 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) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// 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) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// 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) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// CreateHelmRelease
// @Summary create a HelmRelease CR
// @Description Creates a new HelmRelease custom resource in the specified namespace
// @Tags helmrelease
// @Accept json
// @Produce json
// @Param request body message.CreateHelmReleaseReq true "create HelmRelease request"
// @Success 202 {object} message.Result{data=message.CreateHelmReleaseResp}
// @Failure 400 {object} message.Result
// @Failure 409 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /helmreleases [post]
func CreateHelmRelease(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ListHelmReleases
// @Summary List HelmRelease CRs
// @Description Lists all HelmRelease custom resources, optionally filtered by namespace
// @Tags helmrelease
// @Accept json
// @Produce json
// @Param namespace query string false "namespace to filter by"
// @Param request query message.ListHelmReleasesReq true "list HelmReleases request"
// @Success 200 {object} message.Result{data=message.ListHelmReleasesResp}
// @Failure 500 {object} message.Result
// @Router /helmreleases [get]
func ListHelmReleases(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DiffHelmRelease
// @Summary diff a HelmRelease desired state
// @Description Compares requested HelmRelease desired state with live state and returns drift/adoption guard information
// @Tags helmrelease
// @Accept json
// @Produce json
// @Param request body message.DiffHelmReleaseReq true "diff HelmRelease request"
// @Success 200 {object} message.Result{data=message.DiffHelmReleaseResp}
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /helmreleases/diff [post]
func DiffHelmRelease(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// GetHelmRelease
// @Summary get HelmRelease CR details
// @Description Retrieves the details of a specific HelmRelease custom resource
// @Tags helmrelease
// @Accept json
// @Produce json
// @Param name path string true "HelmRelease name"
// @Success 200 {object} message.Result{data=message.GetHelmReleaseResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /helmreleases/{name} [get]
func GetHelmRelease(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// UpdateHelmRelease
// @Summary update HelmRelease CR
// @Description Updates the configuration of an existing HelmRelease custom resource
// @Tags helmrelease
// @Accept json
// @Produce json
// @Param name path string true "HelmRelease name"
// @Param request body message.UpdateHelmReleaseReq true "update HelmRelease request"
// @Success 202 {object} message.Result{data=message.UpdateHelmReleaseResp}
// @Failure 400 {object} message.Result
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /helmreleases/{name} [put]
func UpdateHelmRelease(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DeleteHelmRelease
// @Summary delete HelmRelease CR
// @Description Deletes a HelmRelease custom resource and triggers the associated Helm uninstall
// @Tags helmrelease
// @Accept json
// @Produce json
// @Param namespace path string true "HelmRelease namespace"
// @Param name path string true "HelmRelease name"
// @Success 202 {object} message.Result{data=message.DeleteHelmReleaseResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /helmreleases/{name} [delete]
func DeleteHelmRelease(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// CreateUpgradeOperation
// @Summary Create an upgrade operation
// @Description Creates a new Kubernetes cluster upgrade operation with step-based execution
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param request body message.CreateClusterUpgradeReq true "create cluster upgrade request"
// @Success 202 {object} message.Result{data=message.CreateClusterUpgradeResp}
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /upgradeOperations [post]
func CreateUpgradeOperation(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ListUpgradeOperations
// @Summary List upgrade operations
// @Description Lists all cluster upgrade operations with optional filtering
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param request query message.ListClusterUpgradesReq true "list cluster upgrades request"
// @Success 200 {object} message.Result{data=message.ListClusterUpgradesResp}
// @Failure 500 {object} message.Result
// @Router /upgradeOperations [get]
func ListUpgradeOperations(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// GetUpgradeOperation
// @Summary Get upgrade operation details
// @Description Retrieves the details of a specific cluster upgrade operation
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param id path string true "upgrade operation ID"
// @Success 200 {object} message.Result{data=message.GetClusterUpgradeResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /upgradeOperations/{id} [get]
func GetUpgradeOperation(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// PauseUpgradeOperation
// @Summary Pause an upgrade operation
// @Description Pauses a running cluster upgrade operation
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param id path string true "upgrade operation ID"
// @Success 200 {object} message.Result{data=message.PauseClusterUpgradeResp}
// @Failure 404 {object} message.Result
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /upgradeOperations/{id}/pause [put]
func PauseUpgradeOperation(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ResumeUpgradeOperation
// @Summary Resume a paused upgrade operation
// @Description Resumes a paused cluster upgrade operation
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param id path string true "upgrade operation ID"
// @Success 200 {object} message.Result{data=message.ResumeClusterUpgradeResp}
// @Failure 404 {object} message.Result
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /upgradeOperations/{id}/resume [put]
func ResumeUpgradeOperation(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DeleteUpgradeOperation
// @Summary Delete an upgrade operation
// @Description Deletes/cancels a cluster upgrade operation
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param id path string true "upgrade operation ID"
// @Success 202 {object} message.Result{data=message.DeleteClusterUpgradeResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /upgradeOperations/{id} [delete]
func DeleteUpgradeOperation(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DryRunUpgradeOperation
// @Summary Dry-run an upgrade operation
// @Description Dry-runs a cluster upgrade request and returns the ClusterUpgradeOperation CR that would be created without actually creating it
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param request body message.CreateClusterUpgradeReq true "create cluster upgrade request"
// @Success 200 {object} message.Result{data=message.DryRunClusterUpgradeResp}
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /upgradeOperations/dry-run [post]
func DryRunUpgradeOperation(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// GetNodeGroups
// @Summary Get all node groups and their versions
// @Description Lists all node groups for a cluster with their Kubernetes versions
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param k8sClusterName query string true "Kubernetes cluster name"
// @Param region query string true "Cloud region"
// @Param cloudProvider query string true "Cloud provider (eks, gke, aks, ack, mock)"
// @Success 200 {object} message.Result{data=message.GetNodeGroupsResp}
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /nodeGroups [get]
func GetNodeGroups(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ListAddons
// @Summary List cluster addons
// @Description Lists all addons installed in the cluster with their versions and status
// @Tags upgrade-operation
// @Accept json
// @Produce json
// @Param k8sClusterName query string true "Kubernetes cluster name"
// @Param region query string true "Cloud region"
// @Param cloudProvider query string true "Cloud provider (eks, gke, aks, ack, mock)"
// @Success 200 {object} message.Result{data=message.ListAddonsResp}
// @Failure 400 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /addons [get]
func ListAddons(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// UpdateBasicAuth
// @Summary update basic auth credentials for alertmanager and kube-prometheus-stack
// @Description Updates basic auth credentials for both alertmanager and kube-prometheus-stack HelmReleases using fail-fast approach
// @Tags ops
// @Accept json
// @Produce json
// @Param request body message.UpdateBasicAuthReq true "update basic auth request"
// @Success 200 {object} message.Result{data=message.UpdateBasicAuthResp} "Basic auth credentials updated successfully"
// @Failure 500 {object} message.Result "Basic auth update failed (30004)"
// @Router /alert-auth [put]
func UpdateBasicAuth(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}
