package globalapi

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

// CreateCluster
// @Summary create a observability cluster
// @Description  create a observability cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param request body message.CreateClusterReq true "create request"
// @Success 202 {object} message.Result{data=message.CreateClusterResp}
// @Failure 500 {object} message.Result
// @Router /clusters/ [post]
func CreateCluster(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DetailCluster
// @Summary show detail info of a cluster
// @Description show detail info of a cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request query message.DetailClusterReq true "detail cluster request"
// @Success 200 {object} message.Result{data=message.DetailClusterResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id} [get]
func DetailCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DeleteCluster
// @Summary delete a cluster
// @Description delete a cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request query message.DeleteClusterReq true "delete cluster request"
// @Success 202 {object} message.Result{data=message.DeleteClusterResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id} [delete]
func DeleteCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// PauseCluster
// @Summary pause a cluster
// @Description pause a cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request query message.PauseClusterReq true "pause cluster request"
// @Success 202 {object} message.Result{data=message.PauseClusterResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/pause [put]
func PauseCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ResumeCluster
// @Summary resume a cluster
// @Description resume a cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request query message.ResumeClusterReq true "resume cluster request"
// @Success 202 {object} message.Result{data=message.ResumeClusterResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/resume [put]
func ResumeCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// MuteClusterAlert
// @Summary mute alert of a cluster
// @Description mute alert of a cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request query message.MuteClusterAlertReq true "mute cluster alert request"
// @Success 202 {object} message.Result{data=message.MuteClusterAlertResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/alert/mute [put]
func MuteClusterAlert(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// UnmuteClusterAlert
// @Summary unmute alert of a cluster
// @Description unmute alert of a cluster
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request query message.UnmuteClusterAlertReq true "unmute cluster alert request"
// @Success 202 {object} message.Result{data=message.UnmuteClusterAlertResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/alert/unmute [put]
func UnmuteClusterAlert(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// QueryClusters
// @Summary query clusters
// @Description  query clusters
// @Tags cluster
// @Accept json
// @Produce json
// @Param queryReq query message.QueryClustersReq false "query request"
// @Success 200 {object} message.Result{data=message.QueryClustersResp}
// @Failure 500 {object} message.Result
// @Router /clusters/ [get]
func QueryClusters(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam, enrichShowDeletedQueryClusters)
}

// UpdateCluster
// @Summary update a cluster
// @Description update a cluster's muteAlert, ruleTemplateID, or monitorSpecID
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request body message.UpdateClusterReq true "update cluster request"
// @Success 200 {object} message.Result{data=message.UpdateClusterResp}
// @Failure 404 {object} message.Result
// @Failure 409 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id} [put]
func UpdateCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// GetClusterExternal
// @Summary get cluster info for web console
// @Description get cluster info for web console
// @Tags external
// @Accept json
// @Produce json
// @Param x-region-id header string true "Region id for routing"
// @Param bizType path string true "bizType, for staging, use staging-tidbcloud-nextgen, others, use tidbcloud-nextgen"
// @Param tenantID path string true "tenant id"
// @Param applicationID path string true "application id"
// @Success 200 {object} message.Result{data=message.GetClusterExternalResp}
// @Failure 400 {object} message.Result
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /external/{bizType}/orgs/{tenantID}/clusters/{applicationID}/ [get]
func GetClusterExternal(c *gin.Context) {
	// automatic analysis of routing addresses for forwarding to the regional server
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ModifyMonitorMode
// @Summary adjust spec of monitor share mode
// @Description  adjust spec of monitor share mode
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request body message.ModifyMonitorModeReq true "update monitor share mode request"
// @Success 202 {object} message.Result{data=message.ModifyMonitorModeResp}
// @Failure 404 {object} message.Result
// @Failure 405 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/monitor-mode/ [put]
func ModifyMonitorMode(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ModifyMonitorSpec
// @Summary adjust spec of monitor spec
// @Description  adjust spec of monitor spec
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request body message.ModifyMonitorSpecReq true "update monitor spec request"
// @Success 202 {object} message.Result{data=message.ModifyMonitorSpecResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/monitor-spec/ [put]
func ModifyMonitorSpec(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ModifyMonitorStorage
// @Summary adjust spec of monitor storage
// @Description  adjust spec of monitor storage
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request body message.ModifyMonitorStorageReq true "update monitor storage request"
// @Success 202 {object} message.Result{data=message.ModifyMonitorStorageResp}
// @Failure 404 {object} message.Result
// @Failure 405 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/monitor-storage/ [post]
func ModifyMonitorStorage(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ModifyMonitorResource
// @Summary adjust spec of monitor resource
// @Description  adjust spec of monitor resource
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request body message.ModifyMonitorResourceReq true "update monitor storage resource"
// @Success 202 {object} message.Result{data=message.ModifyMonitorResourceResp}
// @Failure 404 {object} message.Result
// @Failure 405 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/monitor-resource/ [post] //todo
func ModifyMonitorResource(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ModifyAgentObserved
// @Summary modify observed info for monitor agent
// @Description  modify observed info for monitor agent
// @Tags cluster
// @Accept json
// @Produce json
// @Param id path string true "cluster id"
// @Param request body message.ModifyAgentObservedReq true "update monitor agent observed info"
// @Success 202 {object} message.Result{data=message.ModifyAgentObservedResp}
// @Failure 404 {object} message.Result
// @Failure 405 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /clusters/{id}/agent-observed/ [post]
func ModifyAgentObserved(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// UpdateAlertRules
// @Summary update alert rules by cloud user
// @Description update alert rules
// @Tags cluster
// @Accept json
// @Produce json
// @Param bizType path string true "bizType, for staging, use staging-tidbcloud, others, use tidbcloud"
// @Param tenantID path string true "tenant id"
// @Param projectID path string true "project id"
// @Param applicationID path string true "application id"
// @Param request body message.UpdateAlertRulesByCloudUserReq true "update alert rule request"
// @Success 202 {object} message.Result{data=message.UpdateAlertRulesByCloudUserResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /external/{bizType}/orgs/{tenantID}/projects/{projectID}/clusters/{applicationID}/monitor-alertrules [put]
func UpdateAlertRules(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// QueryAlertRules
// @Summary query prometheusrules
// @Description query prometheusrules
// @Tags cluster
// @Accept json
// @Produce json
// @Param bizType path string true "bizType, for staging, use staging-tidbcloud, others, use tidbcloud"
// @Param tenantID path string true "tenant id"
// @Param projectID path string true "project id"
// @Param applicationID path string true "application id"
// @Param request query message.QueryAlertRulesReq true "query prometheusrule request"
// @Success 200 {object} message.Result{data=message.QueryAlertRulesByCloudUserResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /external/{bizType}/orgs/{tenantID}/projects/{projectID}/clusters/{applicationID}/monitor-alertrules [get]
func QueryAlertRules(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// UpdateAlertRulesNextGen
// @Summary update alert rules by cloud user for next gen
// @Description update alert rules
// @Tags cluster
// @Accept json
// @Produce json
// @Param bizType path string true "bizType, for staging, use staging-tidbcloud, others, use tidbcloud"
// @Param tenantID path string true "tenant id"
// @Param applicationID path string true "application id"
// @Param request body message.UpdateAlertRulesByCloudUserReq true "update alert rule request"
// @Success 202 {object} message.Result{data=message.UpdateAlertRulesByCloudUserResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /external/{bizType}/orgs/{tenantID}/clusters/{applicationID}/monitor-alertrules [put]
func UpdateAlertRulesNextGen(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// QueryAlertRulesNextGen
// @Summary query prometheusrules for next gen
// @Description query prometheusrules
// @Tags cluster
// @Accept json
// @Produce json
// @Param bizType path string true "bizType, for staging, use staging-tidbcloud, others, use tidbcloud"
// @Param tenantID path string true "tenant id"
// @Param applicationID path string true "application id"
// @Param request query message.QueryAlertRulesReq true "query prometheusrule request"
// @Success 200 {object} message.Result{data=message.QueryAlertRulesByCloudUserResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /external/{bizType}/orgs/{tenantID}/clusters/{applicationID}/monitor-alertrules [get]
func QueryAlertRulesNextGen(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// QueryAlertRulesInternal
// @Summary query prometheusrules for internal service
// @Description query prometheusrules
// @Tags cluster
// @Accept json
// @Produce json
// @Param bizType path string true "bizType, for staging, use staging-tidbcloud, others, use tidbcloud"
// @Param tenantID path string true "tenant id"
// @Param projectID path string true "project id"
// @Param applicationID path string true "application id"
// @Param request query message.QueryAlertRulesReq true "query prometheusrule request"
// @Success 200 {object} message.Result{data=message.QueryAlertRulesByCloudUserResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /internal/{bizType}/orgs/{tenantID}/projects/{projectID}/clusters/{applicationID}/monitor-alertrules [get]
func QueryAlertRulesInternal(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// ModifyAlertRulesTemplate
// @Summary modify alertrules template
// @Description modify alertrules template
// @Tags cluster
// @Accept json
// @Produce json
// @Param request query message.ModifyAlertRulesTemplateReq true " modify alertrules template request"
// @Success 200 {object} message.Result{data=message.ModifyAlertRulesTemplateResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /alertrule-template/ [post]
func ModifyAlertRulesTemplate(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// DeleteAlertRulesTemplate
// @Summary delete alertrules template
// @Description delete alertrules template
// @Tags cluster
// @Accept json
// @Produce json
// @Param request query message.DeleteAlertRulesTemplateReq true " delete alertrule template request"
// @Success 200 {object} message.Result{data=message.DeleteAlertRulesTemplateResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /alertrule-template/{id} [delete]
func DeleteAlertRulesTemplate(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// GetAlertRulesTemplate
// @Summary get alertrules template
// @Description get alertrules template
// @Tags cluster
// @Accept json
// @Produce json
// @Param request query message.QueryAlertRulesTemplateReq true " get alertrules template request"
// @Success 200 {object} message.Result{data=message.QueryAlertRulesTemplateResp}
// @Failure 404 {object} message.Result
// @Failure 500 {object} message.Result
// @Router /alertrule-template/{id} [get]
func GetAlertRulesTemplate(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

func ApplyLogAlertRules(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}
