package internal_api

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

	"github.com/pingcap-inc/clinic/pkg/api/healthcheck"
)

func registerRouter(
	rg *gin.RouterGroup,
	s *ClusterDataURLsService,
	metadata *DataProxyClusterMetadataService,
	topRU *DataProxyTopRUTargetService,
	slowQuery *DataProxySlowQueryTargetService,
	healthCheckReports *DataProxyHealthCheckReportService,
) {
	internal := rg.Group("/internal")
	internal.GET("/clusters/:cluster_id/cluster-dataurls", s.GetClusterDataURLs)
	registerDataProxyClusterMetadataRoutes(internal, metadata)
	registerDataProxyTopRUTargetRoutes(internal, topRU)
	registerDataProxySlowQueryTargetRoutes(internal, slowQuery)
	registerDataProxyHealthCheckReportRoutes(internal, healthCheckReports)
}

func registerDataProxyHealthCheckReportRoutes(internal *gin.RouterGroup, reports *DataProxyHealthCheckReportService) {
	dataProxy := internal.Group("/data-proxy/v1")
	dataProxy.GET("/orgs/:orgId/clusters/:clusterId/health-check/reports", reports.ListReports)
	dataProxy.GET("/orgs/:orgId/clusters/:clusterId/health-check/reports/:reportId", reports.GetReport)
}

func registerDataProxyClusterMetadataRoutes(internal *gin.RouterGroup, metadata *DataProxyClusterMetadataService) {
	dataProxy := internal.Group("/data-proxy/v1")
	dataProxy.GET("/clusters/:clusterId", metadata.GetCluster)
	dataProxy.GET("/orgs/:orgId/clusters", metadata.ListOrgClusters)
	dataProxy.GET("/orgs/:orgId/clusters/:clusterId", metadata.GetOrgCluster)
}

func registerDataProxyTopRUTargetRoutes(internal *gin.RouterGroup, topRU *DataProxyTopRUTargetService) {
	dataProxy := internal.Group("/data-proxy/v1")
	dataProxy.GET("/orgs/:orgId/clusters/:clusterId/targets/top-ru", topRU.GetTarget)
}

func registerDataProxySlowQueryTargetRoutes(internal *gin.RouterGroup, slowQuery *DataProxySlowQueryTargetService) {
	dataProxy := internal.Group("/data-proxy/v1")
	dataProxy.GET("/orgs/:orgId/clusters/:clusterId/targets/slow-query", slowQuery.GetTarget)
}

var Module = fx.Options(
	fx.Provide(NewClusterDataURLsService),
	fx.Provide(NewDataProxyClusterMetadataService),
	fx.Provide(NewDataProxyTopRUTargetService),
	fx.Provide(NewDataProxySlowQueryTargetService),
	fx.Provide(healthcheck.NewHealthCheckReportQueryService),
	fx.Provide(NewDataProxyHealthCheckReportService),
	fx.Invoke(registerRouter),
)
