package http

import (
	"net/http"

	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/tiinf/tiinf"
	"github.com/tidbcloud/tiinf/transport/http/tigin"

	"github.com/tidbcloud/tidb-management-service/tempo-wrapper/internal/api"
	"github.com/tidbcloud/tidb-management-service/utilities/allowlist"
	"github.com/tidbcloud/tidb-management-service/utilities/httputil"
)

func Setup(inf tiinf.TiInf, allowList *allowlist.AllowLockList) error {
	// Set up tiinf gin engine.
	inf.GinEngine().Handlers = make([]gin.HandlerFunc, 0)
	serviceName, err := tiinf.ServiceNameFromEnv()
	if err != nil {
		return err
	}
	inf.GinEngine().
		Use(gin.Recovery(), httputil.GinServerPayloadLogger, tigin.RecordMetrics, httputil.NewGinServerTracer(serviceName), tigin.SetResponseTraceID)

	pprof.Register(inf.GinEngine())

	eng := inf.GinEngine()

	eng.Any("/healthz", func(c *gin.Context) {
		c.Status(200)
	})

	eng.Any("/version", gin.WrapF(versionHandler))

	eng.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})

	// List lock rules.
	// For debugging purpose. Login jump server and curl.
	lockListGroup := eng.Group("/lock")
	registerLockList(lockListGroup, allowList)

	// List allow list rules.
	// For debugging purpose. Login jump server and curl.
	allowListGroup := eng.Group("/allow")
	registerAllowList(allowListGroup, allowList)

	// init api
	api.InitAPI(inf.GinEngine(), allowList)

	return nil
}
