package internal

import (
	"fmt"
	"os"
	"time"
	"xugu_license/internal/controllers"

	middlewares "xugu_license/internal/middleware"

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

// SetupRouter 配置Gin路由
func SetupRouter() *gin.Engine {
	r := gin.Default()
	// 创建按天生成的日志文件
	logFileName := fmt.Sprintf("./logs/GTlicenseGin-%s.log", time.Now().Format("2006-01-02"))
	f, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		panic(fmt.Sprintf("Failed to open log file: %s", err))
	}
	gin.DefaultWriter = f
	// 自定义日志格式
	r.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
		return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
			param.ClientIP,
			param.TimeStamp.Format(time.RFC1123),
			param.Method,
			param.Path,
			param.Request.Proto,
			param.StatusCode,
			param.Latency,
			param.Request.UserAgent(),
			param.ErrorMessage,
		)
	}))

	// 中间件配置
	//configureMiddleware(r)
	middlewares.CORSMiddleware()
	// 静态文件服务配置
	configureStaticFileServing(r)

	// 根路径请求处理
	configureRootHandler(r)

	public := r.Group("/api")
	{
		// 定义一个路由来主动触发一次数据抓取
		// r.POST("/capture", func(c *gin.Context) {
		// 	capture.CaptureOnce(global.OaDB, global.XuguDB)
		// 	c.JSON(200, gin.H{"status": "Data captured successfully"})
		// })

		public.POST("/register", controllers.Register)
		public.POST("/login", controllers.Login)
		public.GET("/image", func(c *gin.Context) {
			c.File("static/image/xugulogo.png")
		})
	}

	protected := r.Group("/api/admin")
	{
		protected.Use(middlewares.JwtAuthMiddleware()) // 在路由组中使用中间件

		//获取单个用户信息 , 有漏洞,需要判断登录的用户token是否是管理员
		protected.GET("/userInfo", controllers.GetUserInfo)
		//获取所有用户信息
		protected.GET("/userInfoAll", middlewares.PermissionMiddleware(middlewares.ReadUser), controllers.GetAllUserInfo)
		//修改用户信息
		protected.POST("/updateUser", middlewares.PermissionMiddleware(middlewares.UpdateUser), controllers.UpdateUserInfo)
		//删除用户信息
		protected.POST("/deleteUser", middlewares.PermissionMiddleware(middlewares.DeleteUser), controllers.DeleteUser)

		//上传文件
		protected.POST("/upfile", middlewares.PermissionMiddleware(middlewares.UploadLicense), controllers.UploadfileHandler)

		//lincense
		//protected.GET("/LicenseInfo", controllers.GetLicenseInfo)
		protected.POST("/distributeLicense", middlewares.PermissionMiddleware(middlewares.DispatLicense), controllers.DistributeOALicenseController)
		//分发按钮校验
		protected.GET("/GetDistributeButtenCheckController", middlewares.PermissionMiddleware(middlewares.DispatLicense), controllers.GetDistributeButtenCheckController)

		//上传文件的license 弃用
		protected.GET("/distributeLicenseByUserInfo", middlewares.PermissionMiddleware(middlewares.DispatLicense), controllers.DistributeLicenseByUser)
		//获取指定license信息
		protected.GET("/GetSingleSlicenseInfo", middlewares.PermissionMiddleware(middlewares.ReadLicense), controllers.GetSingleLicenseInfoController)
		//获取全部license信息 new
		protected.GET("/GetAllLicenseInfo", middlewares.PermissionMiddleware(middlewares.ReadLicense), controllers.GetAllLicenseInfoController)
		//主动抓取一次oalicense到支撑库
		protected.GET("/GetCaptureLicenseOnce", middlewares.PermissionMiddleware(middlewares.CaptureLicenseOnceToDb), controllers.CaptureLicenseOnceToDb)
		//搜索license
		protected.GET("/GetSearchLicInfoToDb", middlewares.PermissionMiddleware(middlewares.ReadLicense), controllers.SearchLicInfoToDb)
		protected.POST("/GetConditionalSearch", middlewares.PermissionMiddleware(middlewares.ReadLicense), controllers.ConditionalSearchController)
		
		//生成license new
		protected.POST("/GenerateLicense", middlewares.PermissionMiddleware(middlewares.GenerateLicense), controllers.GenerateOALicenseStrController)

		protected.POST("/GetlicenseRecord", middlewares.PermissionMiddleware(middlewares.ReadLicense), controllers.GetlicenseRecordInfo)
		//protected.POST("/GetlicenseRecordInfoByUser", middlewares.PermissionMiddleware(middlewares.ReadLicense), controllers.GetlicenseRecordInfoByUser)
		protected.POST("/UpdateLicense", middlewares.PermissionMiddleware(middlewares.UpdateLicense), controllers.UpdateLicense)
		protected.POST("/deleteLicRow", middlewares.PermissionMiddleware(middlewares.DeleteLicense), controllers.DelLicenseInfoRow)

		//role
		protected.POST("/GetSelfRoles", controllers.GetRoles)
		protected.POST("/GetRoles", middlewares.PermissionMiddleware(middlewares.GetRole), controllers.GetRoles)
		protected.GET("/GetRoleNames", controllers.GetRoleNames)
		protected.POST("/CreateRole", middlewares.PermissionMiddleware(middlewares.CreateRole), controllers.CreateRole)
		protected.POST("/UpdateRole", middlewares.PermissionMiddleware(middlewares.UpdateRole), controllers.UpdateRole)
		protected.POST("/DeleteRole", middlewares.PermissionMiddleware(middlewares.DeleteRole), controllers.DeleteRole)
	}

	return r
}

// configureStaticFileServing 配置静态文件服务
func configureStaticFileServing(r *gin.Engine) {
	r.Static("/static", "./static")
}

// configureRootHandler 配置根路径请求处理
func configureRootHandler(r *gin.Engine) {
	r.GET("/", func(c *gin.Context) {
		c.File("./static/login/login.html")
	})
}

// HttpController 启动 HTTP 服务器
func HttpController() {
	r := SetupRouter()
	r.Run("127.0.0.1:8080")
}