package route

import (
	"kpt-pasture/http/handler"
	"kpt-pasture/http/handler/system"
	"kpt-pasture/http/middleware"

	"github.com/gin-gonic/gin"
)

func SystemAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
	return func(s *gin.Engine) {
		for _, opt := range opts {
			opt(s)
		}
		// Not Found
		s.NoRoute(handler.Handle404)
		// Health Check
		s.GET("/check", handler.Health)
		s.POST("/api/v1/login", system.Login)

		// system API 组  系统用户
		systemRoute := authRouteGroup(s, "/api/v1/system/")
		systemRoute.POST("/user/list", system.SearchSystemUserList)
		systemRoute.PUT("/user/is_show/:id", system.IsShowSystemUser)
		systemRoute.DELETE("/user/:id", system.DeleteUser)
		systemRoute.POST("/user/createOrUpdate", system.UserCreateOrUpdate)
		systemRoute.POST("/user/rest/password", system.ResetPasswordSystemUser)
		systemRoute.GET("/user/role/:user_id", system.UserRole)
		systemRoute.POST("/user/role/save", system.UserRoleSave)

		// 系统角色
		systemRoute.POST("/role/list", system.SearchSystemRoleList)
		systemRoute.DELETE("/role/:id", system.DeleteSystemRole)
		systemRoute.PUT("/role/is_show/:id", system.IsShowSystemRole)
		systemRoute.POST("/role/createOrUpdate", system.RoleCreateOrUpdate)
		systemRoute.GET("/role/menu/:id", system.GetRoleMenu)
		systemRoute.POST("/role/menu/save", system.RoleMenuSave)
		systemRoute.GET("/role/list", system.GetRoleList)

		// 系统菜单权限
		systemRoute.POST("/menu/list", system.SearchSystemMenuList)
		systemRoute.DELETE("/menu/:id", system.DeleteSystemMenu)
		systemRoute.POST("/menu/createOrUpdate", system.CreatedOrUpdateSystemMenu)
		systemRoute.POST("/menu/tree", system.GetSystemMenuTree)

		// 系统部门
		systemRoute.POST("/dept/list", system.DeptList)
		systemRoute.DELETE("/dept/:id", system.DepIsShow)
		systemRoute.POST("/dept/createOrUpdate", system.DepCreateOrUpdate)

		// 登录用户的相关接口
		systemRoute.GET("/user/menu", handler.GetUserMenu)
		systemRoute.POST("/user/logout", handler.Logout)
	}
}

func authRouteGroup(s *gin.Engine, relativePath string) *gin.RouterGroup {
	group := s.Group(relativePath)
	// 中间件鉴权
	group.Use(middleware.RequireAdmin(), middleware.GinLogger(), middleware.CORS())
	return group
}