package diagnosis

import (
	"github.com/gin-gonic/gin"
	"go.uber.org/fx"

	"github.com/pingcap-inc/clinic/pkg/config"
)

func RegisterRouter(v1Router *gin.RouterGroup, api *DiagnosisAPI) {
	// InitDiagnosisAPI(v1Router, api)
	api.logProxy.WithBasePath(v1Router.BasePath())
	diagnosisRouter := v1Router.Group("/diagnosis")
	diagnosisRouter.GET("/annotations", AnnotationGinHandlerFunc(api))
	diagnosisRouter.GET("/node_graph", NodeGraphGinHandlerFunc(api))
	diagnosisRouter.GET("/dynamic_text_value", DynamicTextValueGinHandlerFunc(api))
	// diagnosisRouter.POST("/metrics_sample", InsertMetricsSampleGinHandlerFunc(api))
	forwardInsertLogSample := diagnosisRouter.Group("/log_sample")
	// https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html
	forwardInsertLogSample.PUT("/:index/_doc/:doc_id", InsertLogSampleGinHandlerFunc(api))
	forwardInsertLogSample.POST("/:index/_doc", InsertLogSampleGinHandlerFunc(api))
	forwardInsertLogSample.PUT("/:index/_create/:doc_id", InsertLogSampleGinHandlerFunc(api))
	forwardInsertLogSample.POST("/:index/_create/:doc_id", InsertLogSampleGinHandlerFunc(api))
	// https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html
	forwardInsertLogSample.POST("/_bulk", InsertLogSampleGinHandlerFunc(api))
	forwardInsertLogSample.PUT("/_bulk", InsertLogSampleGinHandlerFunc(api))
	forwardInsertLogSample.POST("/:index/_bulk", InsertLogSampleGinHandlerFunc(api))
	forwardInsertLogSample.PUT("/:index/_bulk", InsertLogSampleGinHandlerFunc(api))
}

var extract = func(cfg *config.Config) (*config.MetricSingleEndpointConfig, *config.LogConfig) {
	return &cfg.DiagnosisConfig.MetricConfig, &cfg.DiagnosisConfig.LogConfig
}

var Module = fx.Options(
	fx.Provide(fx.Annotate(extract, fx.ResultTags(`name:"diagnosismetricsconfig"`, `name:"diagnosislogconfig"`))),
	fx.Provide(fx.Annotate(NewDiagnosisAPI, fx.ParamTags(`name:"diagnosismetricsconfig"`, `name:"diagnosislogconfig"`))),
	fx.Invoke(RegisterRouter),
)
