package server

import (
	"gadmin/config"
	"gadmin/internal/admin/api"
	"gadmin/internal/admin/middleware"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"net/http"
	"strings"
)

// NewEngine 路由配置
func NewEngine() *gin.Engine {
	r := gin.New()

	//gin.SetMode(os.Getenv(gin.EnvGinMode))

	gin.SetMode(gin.ReleaseMode)

	// 必要中间件
	r.Use(middleware.Recover, middleware.Cors)

	r.GET("/", func(c *gin.Context) {
		c.Redirect(http.StatusTemporaryRedirect, "/adminentrance")
	})
	// 静态资源目录
	r.StaticFS("/adminentrance", http.Dir("./dist"))

	// 日志中间件
	r.Use(middleware.Logger)

	// 路由
	group := r.Group("/entrance/api")
	{
		group.GET("ping", api.Ping)             // ping
		group.POST("user/login", api.UserLogin) // 用户登录

		feishu := group.Group("feishu")
		//feishu.Use(middleware.ApiToken())
		feishu.GET("feiShuUserLogin", api.FeiShuUserInfoLogin)

		// 只需要验证token的
		checkToken := group.Group("")
		checkToken.Use(middleware.Token())
		{
			checkToken.GET("service/list", api.ServiceList)                // 服务列表
			checkToken.POST("service/select", api.ServiceSelect)           // 选择系统
			checkToken.GET("user/checkRolePermission", api.RolePermission) // 管理员用户是否拥有权限管理
		}

		// 需要登录保护的
		auth := group.Group("")
		auth.Use(middleware.Token(), middleware.Permission()) // 顺序不能调整
		{
			// 管理员操作
			admin := auth.Group("admin")
			auth.GET("user/me", api.UserMe)                      // 用户信息
			admin.GET("roleList", api.AdminRoleList)             // 角色列表
			admin.GET("roleAuthOption", api.AdminRoleAuthOption) // 角色权限选项
			admin.GET("rolePageOption", api.AdminRolePageOption) // 角色可查看页面选项
			admin.POST("roleEdit", api.AdminRoleEdit)            // 角色修改/创建
			admin.GET("roleOption", api.AdminRoleOption)         // 角色选项
			admin.GET("userList", api.AdminUserList)             // 用户列表
			admin.POST("userEdit", api.AdminUserEdit)            // 用户修改/创建
		}
	}

	for _, info := range r.Routes() {
		path := strings.TrimPrefix(info.Path, "/entrance")
		if info.Method == http.MethodPost && !config.HasMenu(path) {
			logrus.Panicf("菜单未绑定名称:%v", info.Path)
		}
	}

	return r
}
