package controllers

import (
	"exhibitionCentre/base"
	"exhibitionCentre/logging"
	"exhibitionCentre/models"
	"exhibitionCentre/utils"
	"fmt"
)

type AddUserInfo struct {
	Email       string `json:"email"`
	Role        string `json:"role"`
	DisplayName string `json:"display_name"`
}

type DeleteUserInfo struct {
	Email string `json:"email"`
}

func AddUser(router *base.Router) (int, []byte) {
	// 鉴权
	jwt, authorized := Authenticate(router)
	if !authorized || jwt.Role != int(models.Admin) {
		logging.Log.Error("添加用户鉴权失败")
		return 0, nil
	}

	// 解析request数据
	var info AddUserInfo
	if err := utils.JsonParse(router.Data, &info); err != nil {
		logging.Log.Error("解析数据失败: ", err.Error())
		return 403, utils.SerializeErrorData("添加用户失败!")
	}

	// 获取email的用户是否存在
	user, err := models.GetUser(info.Email)
	if err == nil {
		// 发送邀请邮件
		if !utils.SendInvitationEmail(info.Email) {
			logging.Log.Errorf("发送邀请邮件失败，用户(%s)\n", info.Email)
			return 403, utils.SerializeErrorData("发送邀请邮件失败!")
		}
		return 200, utils.SerializeErrorData("邀请邮件已发送")
	}

	// 添加用户
	if info.Role == "1" {
		user = models.AddPublisher(info.Email, info.DisplayName)
	} else if info.Role == "2" {
		user = models.AddAdministrator(info.Email, info.DisplayName)
	}

	// 检查用户是否存在
	if user == nil {
		logging.Log.Errorf("添加用户(%s)失败", info.Email)
		return 403, utils.SerializeErrorData(fmt.Sprintf("添加用户(%s)失败!", info.Email))
	}

	// 发送邀请邮件
	if !utils.SendInvitationEmail(info.Email) {
		logging.Log.Errorf("发送邀请邮件失败，用户(%s)\n", info.Email)
		return 403, utils.SerializeErrorData("发送邀请邮件失败!")
	}
	return 200, utils.Serialize(user)
}

func DeleteUser(router *base.Router) (int, []byte) {
	// 鉴权
	jwt, authorized := Authenticate(router)
	if !authorized || jwt.Role != int(models.Admin) {
		logging.Log.Error("删除用户鉴权失败")
		return 0, nil
	}

	// 解析request数据
	var info DeleteUserInfo
	if err := utils.JsonParse(router.Data, &info); err != nil {
		logging.Log.Error("解析数据失败: ", err.Error())
		return 403, utils.SerializeErrorData("删除用户失败!")
	}

	// 获取email的用户是否存在
	user, err := models.GetUser(info.Email)
	if err != nil {
		logging.Log.Errorf("删除用户(%s)不存在", info.Email)
		return 404, utils.SerializeErrorData(fmt.Sprintf("删除用户(%s)不存在!", info.Email))
	}

	// // 判断权限
	// if user.Role >= models.RoleLevel(jwt.Role) {
	// 	logging.Log.Errorf("管理员(%v)权限(%v)不足，无法删除用户(%v, 权限: %v)\n", jwt.Email, jwt.Role, user.Email, user.Role)
	// 	return 403, utils.SerializeErrorData("权限不足，删除失败!")
	// }

	// 删除用户
	if err := models.DeleteUser(user.Email); err != nil {
		logging.Log.Errorf("管理员(%v, 权限:%v)，删除数据库用户(%v, 权限: %v), err: %v\n", jwt.Email, jwt.Role, user.Email, user.Role, err.Error())
		return 403, utils.SerializeErrorData("删除用户失败!")
	}
	return 200, utils.Serialize(&info)
}
