package globalapi

import (
	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/observability/pkg/common/errors"
	"github.com/tidbcloud/observability/pkg/regionalapi/apiinterceptor"
)

// OpenCreateCluster
// @Summary Create an observability cluster
// @Tags Cluster
// @Accept json
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param request body message.OpenCreateClusterRequest true "Create request"
// @Success 202 {object} message.Result{data=message.OpenObservabilityCluster}
// @Success 409 {object} message.Result{data=message.OpenObservabilityCluster}
// @Failure 500 {object} message.Result
// @Router /api/v2/observability/clusters/ [post]
func OpenCreateCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenGetClusterList
// @Summary Query cluster list
// @Tags Cluster
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param projectID query string false "Project ID"
// @Param applicationID query string false "Application ID"
// @Success 200 {object} message.Result{data=message.OpenClusterListResponse}
// @Router /api/v2/observability/clusters/ [get]
func OpenGetClusterList(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenGetClusterDetail
// @Summary Get cluster details
// @Tags Cluster
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "Cluster ID"
// @Success 200 {object} message.Result{data=message.OpenObservabilityCluster}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id} [get]
func OpenGetClusterDetail(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenDeleteCluster
// @Summary Delete cluster
// @Tags Cluster
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "Cluster ID"
// @Success 202 {object} message.Result{data=message.OpenObservabilityCluster}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id} [delete]
func OpenDeleteCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenPauseCluster
// @Summary Pause cluster
// @Tags Cluster
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "Cluster ID"
// @Success 202 {object} message.Result{data=message.OpenObservabilityCluster}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id}/:pause [post]
func OpenPauseCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenResumeCluster
// @Summary Resume cluster
// @Tags Cluster
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "Cluster ID"
// @Success 202 {object} message.Result{data=message.OpenObservabilityCluster}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id}/:resume [post]
func OpenResumeCluster(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenUpdateCategoryConfig
// @Summary Update category configuration
// @Tags Cluster
// @Accept json
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "Cluster ID"
// @Param module path string true "Module name" enum(logs,metrics,topsql,slowlog,profile,key_visualizer)
// @Param request body message.OpenModuleConfigRequest true "Configuration"
// @Success 200 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id}/{category}/config [put]
func OpenUpdateCategoryConfig(c *gin.Context) {
	apiinterceptor.Fail(c, errors.New(errors.APINotFound, "api not supported yet"))
}

// OpenUpdateCategoryStatus
// @Summary Update category status
// @Tags Cluster
// @Accept json
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "Cluster ID"
// @Param category path string true "category name" enum(logs,metrics,alerts,topsql,slowlog,profile,key_visualizer)
// @Param request body message.OpenModuleStatusRequest true "Status"
// @Success 200 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id}/{category}/status [put]
func OpenUpdateCategoryStatus(c *gin.Context) {
	apiinterceptor.Fail(c, errors.New(errors.APINotFound, "api not supported yet"))
}

// OpenGetAlertRuleTemplates
// @Summary Get alert rule templates
// @Tags AlertRule
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Success 200 {object} message.Result{data=message.OpenAlertRuleTemplateList}
// @Router /api/v2/observability/alertrule/templates [get]
func OpenGetAlertRuleTemplates(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenGetAlertRuleTemplateDetail
// @Summary Get alert rule template detail
// @Tags AlertRule
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param template_id path string true "Template ID"
// @Success 200 {object} message.Result{data=message.OpenAlertRule}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/alertrule/templates/{template_id} [get]
func OpenGetAlertRuleTemplateDetail(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenGetClusterAlertRule
// @Summary Get alert rule template detail
// @Tags AlertRule
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "cluster ID"
// @Success 200 {object} message.Result{data=message.OpenAlertRule}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id}/alertrule/ [get]
func OpenGetClusterAlertRule(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}

// OpenUpdateClusterAlertRule
// @Summary Get alert rule template detail
// @Tags AlertRule
// @Produce json
// @Param x-vendor header string true "Cloud vendor" enum(aws,gcp,azure)
// @Param x-region header string true "Region"
// @Param x-org-id header string true "Organization ID"
// @Param cluster_id path string true "cluster ID"
// @Param alert_rules body message.OpenAlertRule true "content"
// @Success 200 {object} message.Result{data=message.OpenAlertRule}
// @Failure 404 {object} message.Result
// @Router /api/v2/observability/clusters/{cluster_id}/alertrule/ [put]
func OpenUpdateClusterAlertRule(c *gin.Context) {
	AutoRouteRegionalServer(c, defaultOptionalParam)
}
