package routers

import (
	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"

	// "go.uber.org/zap"
	"goskeleton/app/global/consts"
	"goskeleton/app/global/variable"
	"goskeleton/app/http/controller/captcha"
	"goskeleton/app/http/middleware/authorization"
	"goskeleton/app/http/middleware/cors"
	validatorFactory "goskeleton/app/http/validator/core/factory"
	// "goskeleton/app/utils/gin_release"
	// "net/http"
)

func InitWebRouter_Co() *gin.Engine {
	var router *gin.Engine = gin.Default()
	// 日志显示在控制台
	pprof.Register(router)

	//根据配置进行设置跨域
	if variable.ConfigYml.GetBool("HttpServer.AllowCrossDomain") {
		router.Use(cors.Next())
	}

	// 创建一个验证码路由
	verifyCode := router.Group("captcha")
	{
		// 验证码业务，该业务无需专门校验参数，所以可以直接调用控制器
		verifyCode.GET("/", (&captcha.Captcha{}).GenerateId)                          //  获取验证码ID
		verifyCode.GET("/:captcha_id", (&captcha.Captcha{}).GetImg)                   // 获取图像地址
		verifyCode.GET("/:captcha_id/:captcha_value", (&captcha.Captcha{}).CheckCode) // 校验验证码
	}
	//  创建一个后端接口路由组
	backend := router.Group("/admin/")
	{

		//  【不需要token】中间件验证的路由  用户注册、登录
		noAuth := backend.Group("users/")
		{
			// 关于路由的第二个参数用法说明
			// 1.编写一个表单参数验证器结构体，参见代码：   app/http/validator/web/users/register.go
			// 2.将以上表单参数验证器注册，遵守 键 =》值 格式注册即可 ，app/http/validator/common/register_validator/web_register_validator.go  20行就是注册时候的键 consts.ValidatorPrefix+"UsersRegister"
			// 3.按照注册时的键，直接从容器调用即可 ：validatorFactory.Create(consts.ValidatorPrefix+"UsersRegister")
			noAuth.POST("register", validatorFactory.Create(consts.ValidatorPrefix+"UsersRegister")) // ok
			// 不需要验证码即可登陆
			noAuth.POST("login", validatorFactory.Create(consts.ValidatorPrefix+"UsersLogin")) // ok

			// 如果加载了验证码中间件，那么就需要提交验证码才可以登陆（本质上就是给登陆接口增加了2个参数：验证码id提交时的键：captcha_id 和 验证码值提交时的键 captcha_value，具体参见配置文件）
			//noAuth.Use(authorization.CheckCaptchaAuth()).POST("login", validatorFactory.Create(consts.ValidatorPrefix+"UsersLogin"))

			// 获取公钥，用于密码等敏感信息的加密
			noAuth.POST("publickey", validatorFactory.Create(consts.ValidatorPrefix+"PublicKey"))
		}

		// 刷新token
		refreshToken := backend.Group("users/")
		{
			// 刷新token，当过期的token在允许失效的延长时间范围内，用旧token换取新token
			refreshToken.Use(authorization.RefreshTokenConditionCheck()).POST("refreshtoken", validatorFactory.Create(consts.ValidatorPrefix+"RefreshToken"))
		}
		// TODO:linlnf
		// 人工智能识别相关
		aiRecognition := backend.Group("ai_recognition/")
		{
			// 请求图片文字识别
			aiRecognition.POST("pic_recognition", validatorFactory.Create(consts.ValidatorPrefix+"PicRecognition"))
			// 请求语音识别
			aiRecognition.POST("voc_recognition", validatorFactory.Create(consts.ValidatorPrefix+"VocRecognition"))
		}
		// TODO:linlnf
		// 人工智能文档处理相关
		aiDoc := backend.Group("ai_doc/")
		{
			// 请求优化文字
			aiDoc.POST("doc_refine", validatorFactory.Create(consts.ValidatorPrefix+"DocRefine"))
		}

		// 智能排版相关
		aiLayout := backend.Group("ai_layout/")
		{
			// 请求样式生成
			aiLayout.POST("style_generate", validatorFactory.Create(consts.ValidatorPrefix+"StyleGenerate"))
			// 请求排版
			aiLayout.POST("layout_generate", validatorFactory.Create(consts.ValidatorPrefix+"LayoutGenerate"))
		}

		// 【需要token】中间件验证的路由
		backend.Use(authorization.CheckTokenAuth())
		{
			// 用户组路由
			users := backend.Group("users/")
			{
				// 查询 ，这里的验证器直接从容器获取，是因为程序启动时，将验证器注册在了容器，具体代码位置：App\Http\Validator\Web\Users\xxx
				// 展示用户详细信息-用户名、ID
				users.GET("info", validatorFactory.Create(consts.ValidatorPrefix+"UsersInfo"))
				// 新增
				// users.POST("create", validatorFactory.Create(consts.ValidatorPrefix+"UsersStore")) // not need
				// 更新用户名或密码
				users.POST("username", validatorFactory.Create(consts.ValidatorPrefix+"UsersNameUpdate"))
				users.POST("password", validatorFactory.Create(consts.ValidatorPrefix+"UsersPasswordUpdate"))
				// 注销用户
				users.POST("delete", validatorFactory.Create(consts.ValidatorPrefix+"UsersDestroy"))
				// 退出登录
				users.POST("logout", validatorFactory.Create(consts.ValidatorPrefix+"UsersLogout"))
			}
		}
		//【需要token】中间件验证的路由
		backend.Use(authorization.CheckTokenAuth())
		{
			// 文件操作相关路由组
			file := backend.Group("file/")
			{
				//创建文件
				file.POST("file_creat", validatorFactory.Create(consts.ValidatorPrefix+"FileCreat"))
				//打开文件
				file.GET("file_get", validatorFactory.Create(consts.ValidatorPrefix+"FileGet"))
				//文件重命名
				file.POST("file_rename", validatorFactory.Create(consts.ValidatorPrefix+"FileRename"))
				//移动文件
				file.POST("file_move", validatorFactory.Create(consts.ValidatorPrefix+"FileMove"))
				//保存文件
				file.POST("file_save", validatorFactory.Create(consts.ValidatorPrefix+"FileSave"))
				//删除文件
				file.POST("file_delete", validatorFactory.Create(consts.ValidatorPrefix+"FileDelete"))
				//创建文件夹
				file.POST("folder_creat", validatorFactory.Create(consts.ValidatorPrefix+"FolderCreat"))
			}
		}

	}
	return router
}
