package server

import (
	"mini_server/internal/config"
	"mini_server/internal/dao"
	"mini_server/internal/logger"
	"mini_server/internal/middleware/cors"
	"mini_server/internal/middleware/jwt"
	"mini_server/internal/middleware/tls"
	"mini_server/internal/server/bluetooth"
	chatrecord "mini_server/internal/server/chat_record"
	"mini_server/internal/server/file"
	"mini_server/internal/server/post"
	"mini_server/internal/server/role"
	"mini_server/internal/server/user"
	"mini_server/internal/server/wx"

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

type Server struct {
	e       *gin.Engine
	address string
}

func NewServer(address, dsn string) (*Server, error) {
	err := dao.InitDefaultService(dsn)
	if err != nil {
		return nil, err
	}
	gin.DefaultWriter = logger.GinLogger
	e := gin.Default()
	srv := &Server{e: e, address: address}
	srv.init_v1_handler()
	return srv, nil
}

func (s *Server) GetGinEngine() *gin.Engine { return s.e }

func (s *Server) Run() error {
	if config.TlsEnable { // 启用tls
		return s.e.RunTLS(s.address, config.TlsFilePem, config.TlsFileKey)
	}
	return s.e.Run(s.address)
}

func (s *Server) init_v1_handler() {

	if config.TlsEnable { // 是否开启https
		logrus.Info("use TLS")
		s.e.Use(tls.TlsHandler())
	}

	api := s.e.Group("api")

	if config.JwtEnable { // 是否开启jwt校验
		logrus.Info("use JWT")
		api.Use(jwt.AuthMiddleware())
	}

	if config.CorsEnable { // 是否开启跨域处理
		logrus.Info("use CORS")
		api.Use(cors.CorsMiddleware())
	}

	users := api.Group("users")
	{
		// users.GET("/:user_id", user.Query)                 // 获取用户信息。小程序未使用。
		users.PUT("/username", user.ChangeUsername)  // 更新用户名称
		users.PUT("/avatar_id", user.ChangeAvatarId) // 更新用户头像
		users.POST("/wx/login", wx.WxLogin)          // 微信登录
	}

	// 聊天相关功能
	chats := api.Group("chat_records")
	{
		chats.GET("/", chatrecord.History)       // 获取单个角色历史聊天记录
		chats.GET("/all", chatrecord.HistoryAll) // 获取所有角色历史聊天记录
		chats.POST("/", chatrecord.Upload)       // 发送聊天消息，进行存储
		chats.GET("/exists", chatrecord.Exists)  // 判断用户与角色是否有聊天记录
	}

	// 帖子相关接口
	posts := api.Group("post")
	{
		posts.GET("/", post.List)                                          // 获取社区帖子列表，支持按照时间查询，支持根据角色筛选
		posts.GET("/:post_id", post.Query)                                 // 获取帖子详情
		posts.POST("/", post.Upload)                                       // 发布帖子
		posts.POST("/:post_id/like", post.Like)                            // 帖子点赞
		posts.DELETE("/:post_id/like", post.UnLike)                        // 帖子取消点赞
		posts.GET("/:post_id/comments/", post.QueryComment)                // 获取帖子的全部评论
		posts.POST("/:post_id/comments/", post.UploadComment)              // 添加一条评论
		posts.DELETE("/:post_id/comments/:comment_id", post.DeleteComment) // 删除评论
	}
	// 草稿相关接口
	drafts := api.Group("drafts")
	{
		drafts.GET("/", post.QueryDraft)     // 获取草稿。目前草稿的处理逻辑是，一个用户只保存一张草稿。
		drafts.POST("/", post.SaveDraft)     // 保存草稿
		drafts.DELETE("/", post.DeleteDraft) // 删除草稿
	}

	// 图片和音频等文件相关功能。
	files := api.Group("files")
	{
		files.POST("/", file.Upload)           // 文件上传
		files.DELETE("/:file_id", file.Delete) // 文件删除
	}
	s.e.GET("/api/files/:file_id", file.Download) // 文件下载 /////////// 注：为了保证图片通过<image>标签下载（未设置header）。文件相关接口不受jwt限制。

	// 蓝牙接口
	bluetooths := api.Group("bluetooths")
	{
		bluetooths.GET("/", bluetooth.QueryAll)  // 查询蓝牙接口列表
		bluetooths.POST("/", bluetooth.Create)   // 增加某个蓝牙的具体信息
		bluetooths.DELETE("/", bluetooth.Delete) // 删除某个蓝牙的具体信息
	}

	// 角色接口
	roles := api.Group("roles")
	{
		roles.GET("/all", role.QueryAllRole) // 获取所有角色
		roles.POST("/", role.Create)         // 添加角色
		roles.GET("/", role.QueryList)       // 获取用户绑定的角色列表
		// roles.DELETE("/:role_id", role.Delete) // 删除角色。 小程序未使用此接口。
		// roles.GET("/:role_id", role.Query)     // 获取角色详情。 小程序未使用此接口。
	}
}
