package apiserver

import (
	"github.com/gin-gonic/gin"
	"github.com/marmotedu/errors"
	"github.com/pingcap-inc/pinsights/internal/apiserver/controller/v1/authz"
	"github.com/pingcap-inc/pinsights/internal/apiserver/controller/v1/cube"
	"github.com/pingcap-inc/pinsights/internal/apiserver/controller/v1/dashboard"
	"github.com/pingcap-inc/pinsights/internal/apiserver/controller/v1/lark"
	"github.com/pingcap-inc/pinsights/internal/apiserver/store/mysql"
	"github.com/pingcap-inc/pinsights/internal/pkg/code"
	"github.com/pingcap-inc/pinsights/internal/pkg/middleware"
	"github.com/pingcap-inc/pinsights/pkg/util/core"
)

func initRouter(g *gin.Engine) {
	installMiddleware(g)
	installController(g)
}

func installMiddleware(g *gin.Engine) {
}

func installController(g *gin.Engine) *gin.Engine {
	g.NoRoute(middleware.Auth(), func(c *gin.Context) {
		core.WriteResponse(c, errors.WithCode(code.ErrPageNotFound, "Page not found."), nil)
	})

	storeIns, _ := mysql.GetMySQLFactoryOr(nil)
	v1 := g.Group("/v1")
	{
		cubev1 := v1.Group("/cube", middleware.Auth())
		{
			cubev1.POST("/token", cube.GetToken)
		}

		larkv1 := v1.Group("/lark", middleware.Auth())
		glarkv1 := v1.Group("/glark")
		{
			larkUserController := lark.NewLarkUserController(storeIns)
			larkBiTableController := lark.NewLarkBiTableController(storeIns)
			larkEventController := lark.NewLarkEventController(storeIns)
			larkv1.GET("/user", larkUserController.Get)
			larkv1.GET("/bitables", larkBiTableController.GetBiTables)
			larkv1.GET("/bitables/records", larkBiTableController.MGetBiTableRecords)
			glarkv1.POST("/event", larkEventController.ValidateLarkEvent)
		}

		dashboardv1 := v1.Group("/dashboards", middleware.Auth())
		{
			dashboardController := dashboard.NewDashboardController(storeIns)
			dashboardv1.GET("", dashboardController.List)
		}

		authzv1 := v1.Group("/authz", middleware.Auth())
		{
			authzController := authz.NewAuthzController(storeIns)
			authzv1.POST("/reload", authzController.Reload)
		}
	}

	return g
}
