package controllers

import (
	"fmt"
	"net/http"
	"regexp"

	"xugu_license/internal/api"
	"xugu_license/internal/global"
	middlewares "xugu_license/internal/middleware"
	"xugu_license/internal/models"
	"xugu_license/internal/utils"
	tokens "xugu_license/internal/utils/token"

	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
)

// /api/register的请求体
type ReqRegister struct {
	Username  string `json:"username" binding:"required"`
	Account   string `json:"Account" binding:"required"`
	Password  string `json:"password" binding:"required"`
	TELEPHONE string `json:"TELEPHONE" binding:"required"`
	EMAIL     string `json:"EMAIL" binding:"required"`
}

func Register(c *gin.Context) {
	var req ReqRegister
	if err := c.ShouldBindBodyWithJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(),
		})
		return
	}
	//TODO判断密码,邮箱,电话 合法性

	//定义正则表达式,匹配仅包含字母和数字的字符串
	reg := regexp.MustCompile("^[a-zA-Z0-9]+$")
	if !reg.MatchString(req.Account) {
		global.Logger.Errorln("账户仅能包含字母和数字 ")
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "账户仅能包含字母和数字",
		})
		return
	}

	if len(req.Password) < 6 {
		global.Logger.Errorln("密码长度不能小于6位 ")
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "密码长度不能小于6位",
		})
		return
	}
	if len(req.TELEPHONE) != 11 {
		global.Logger.Errorln("电话号码长度不正确 ")

		c.JSON(http.StatusBadRequest, gin.H{
			"error": "电话号码长度不正确",
		})
		return
	}
	// if len(req.EMAIL) < 6 {
	// 	c.JSON(http.StatusBadRequest, gin.H{
	// 		"error": "邮箱长度不能小于6位",
	// 	})
	// 	return
	// }
	//TODO判断用户名,邮箱,电话 是否重复
	userTmp, err := models.CheckEmailOrTelphoneOrAccount(req.Username, req.Account, req.EMAIL, req.TELEPHONE)
	if err != nil {
		global.Logger.Errorln("数据库查询重复用户失败 ", err.Error())
		c.JSON(http.StatusBadRequest, gin.H{

			"error": fmt.Sprintln("数据库查询重复用户失败: ", err.Error()),
		})
		return
	}

	if userTmp.Username == req.Username {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "用户名重复",
		})
		return
	}
	//fmt.Printf("userTmp: %#v ", userTmp)
	if userTmp.Account == req.Account {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "账号重复",
		})
		return
	}
	if userTmp.Email == req.EMAIL {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "邮箱重复",
		})
		return
	}
	if userTmp.Telephone == req.TELEPHONE {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "电话重复",
		})
		return
	}

	uId := utils.GenerateShortIdentifier(req.Account, req.EMAIL, req.TELEPHONE)
	//加密密码
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
	if err != nil {
		return
	}
	req.Password = string(hashedPassword)

	_, err = global.XuguDB.Exec("INSERT INTO lic_USER (UNIQUEID,username,Account, password,TELEPHONE,email) VALUES (?, ?,?,?,?,?)", uId, req.Username, req.Account, req.Password, req.TELEPHONE, req.EMAIL)
	if err != nil {
		global.Logger.Errorln("数据库创建新用户插入失败 ", err.Error())

		c.JSON(http.StatusBadRequest, gin.H{

			"error": fmt.Sprintln("创建用户失败: ", err.Error()),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"success": "register success",
		"data":    req,
	})

}

// api/login 的请求体
type ReqLogin struct {
	Account  string `json:"Account" binding:"required"`
	Password string `json:"password" binding:"required"`
}

func Login(c *gin.Context) {
	var req ReqLogin
	if err := c.ShouldBindBodyWithJSON(&req); err != nil {
		global.Logger.Errorln("解析请求失败 ", err.Error())
		c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
		return
	}

	token, err := models.LoginCheck(req.Account, req.Password)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": "账号或密码不对",
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"token": token,
	})

}

func GetUserInfo(c *gin.Context) {

	// 从token中解析出user_id

	userClaims, err := tokens.ExtractTokenID(c)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(),
		})
		return
	}

	u, err := models.GetUserInfoByID(userClaims.UserId)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(),
		})
		return
	}
	fmt.Println("sdsad u", u)
	c.JSON(http.StatusOK, gin.H{
		"message": "success",
		"data":    u,
	})

}

func GetAllUserInfo(c *gin.Context) {

	// 从token中解析出user_id

	u, err := models.GetAllUser()
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(),
		})
		return
	}

	fmt.Println("sdsad u", u)

	type allUserInfo struct {
	}

	c.JSON(http.StatusOK, gin.H{
		"message": "success",
		"data":    u,
	})

}

func UpdateUserInfo(c *gin.Context) {
	//获取用户信息和权限
	userInfo, err := getLoginInfo(c)
	if err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户信息不存在"})
		c.Abort()
	}

	var req api.UserInfoRequest
	if err := c.ShouldBindBodyWithJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(),
		})
		return
	}
	if userInfo.Permission[middlewares.UpdateRole] != middlewares.UpdateRole {
		req.Role = userInfo.Role
	}

	if req.Password != "" {
		//加密密码
		hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
		if err != nil {
			return
		}

		req.Password = string(hashedPassword)
		if err := models.UpdateUserInfo(req); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}
	} else {
		if err := models.UpdateUserInfo(req); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		}
	}

	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"message": "用户信息更新成功",
	})
}

func DeleteUser(c *gin.Context) {
	type ReqDeleteUser struct {
		UniqueID string `json:"UniqueID" `
	}
	var UniqueID ReqDeleteUser
	if err := c.ShouldBindBodyWithJSON(&UniqueID); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": fmt.Sprintln("解析请求失败: ", err.Error()),
		})
		return
	}

	if err := models.DeleteUserInfo(UniqueID.UniqueID); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"error": fmt.Sprintln("数据库操作失败: ", err.Error()),
		})
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"message": "已删除用户",
	})

}