package dataapi

import (
	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	docs "github.com/tidbcloud/observability/api/regionalserverswagger"
	"github.com/tidbcloud/observability/pkg/common/constants"
	commonInterceptor "github.com/tidbcloud/observability/pkg/common/interceptor"
	"github.com/tidbcloud/observability/pkg/common/metrics"
)

func route(g *gin.Engine) {
	docs.SwaggerInfo.BasePath = "/api/v1"

	// support swagger
	swagger := g.Group("/swagger")
	{
		swagger.GET("/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
	}

	// enable pprof
	pprof.Register(g)

	// api
	apiV1 := g.Group("/api/v1")
	apiV1.Use(commonInterceptor.Log, gin.CustomRecovery(commonInterceptor.Recover))
	{
		apiV1.GET("/", ServiceInfo)
	}

	apiV1.GET("/:bizType/orgs/:tenantID/projects/:projectID/clusters/:applicationID/prometheus/query", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)
	apiV1.POST("/:bizType/orgs/:tenantID/projects/:projectID/clusters/:applicationID/prometheus/query", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)
	apiV1.GET("/:bizType/orgs/:tenantID/projects/:projectID/clusters/:applicationID/prometheus/query_range", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)
	apiV1.POST("/:bizType/orgs/:tenantID/projects/:projectID/clusters/:applicationID/prometheus/query_range", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)

	apiV1.Any("/:bizType/orgs/:tenantID/projects/:projectID/clusters/:applicationID/prometheus/:path", proxyHandler)

	apiV1.GET("/:bizType/orgs/:tenantID/clusters/:applicationID/prometheus/query", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)
	apiV1.POST("/:bizType/orgs/:tenantID/clusters/:applicationID/prometheus/query", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)
	apiV1.GET("/:bizType/orgs/:tenantID/clusters/:applicationID/prometheus/query_range", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)
	apiV1.POST("/:bizType/orgs/:tenantID/clusters/:applicationID/prometheus/query_range", metrics.HandleRegionalAPIMetrics(constants.EndpointHistoricalMetrics), QueryHistoricalMetrics)

	apiV1.Any("/:bizType/orgs/:tenantID/clusters/:applicationID/prometheus/:path", proxyHandler)
}
