package router

import (
	"epur-pay/cache"
	"epur-pay/pkg/config"
	"epur-pay/pkg/dapi"
	"github.com/gin-contrib/gzip"
	"github.com/gin-gonic/gin"
	cors "github.com/itsjamie/gin-cors"
)

func Router() *gin.Engine {

	gin.SetMode(config.Cf.Common.RunMode)

	engine := gin.New()
	engine.Use(Logs(), cors.Middleware(cors.Config{
		ValidateHeaders: false,
		Origins:         "*",
		RequestHeaders:  "*",
		ExposedHeaders:  "*",
		Methods:         "*",
		MaxAge:          0,
		Credentials:     false,
	}), gzip.Gzip(gzip.DefaultCompression), IPBlackList(), gin.Recovery())

	goApi := engine.Group("/api/v1")

	NewRouterFunc()
	for index, item := range cache.Global.Routers {
		var apiRouter *gin.RouterGroup
		if !item.Leaf {
			apiRouter = goApi.Group(item.Path)
			for indexChild, itemChild := range item.Child {
				item.Child[indexChild].Params.(*dapi.InParams).SaveEvent = itemChild.Name
				switch itemChild.Method {
				case "POST":
					apiRouter.POST(itemChild.Path, dapi.ApiDecorator(itemChild.F, itemChild.Params.(*dapi.InParams)))
				default:
					apiRouter.GET(itemChild.Path, dapi.ApiDecorator(itemChild.F, itemChild.Params.(*dapi.InParams)))
				}
			}
		} else {
			apiRouter = goApi
			cache.Global.Routers[index].Params.(*dapi.InParams).SaveEvent = item.Name
			switch item.Method {
			case "POST":
				apiRouter.POST(item.Path, dapi.ApiDecorator(item.F, item.Params.(*dapi.InParams)))
			default:
				apiRouter.GET(item.Path, dapi.ApiDecorator(item.F, item.Params.(*dapi.InParams)))
			}
		}
	}

	return engine
}