package controllers

import (
	"boss/common"
	"boss/datas"
	"boss/models/user"
	"boss/utils"
	"github.com/beego/beego/v2/adapter/validation"
	"github.com/beego/beego/v2/core/logs"
	beego "github.com/beego/beego/v2/server/web"
)

type LoginController struct {
	beego.Controller
}

func (c *LoginController) Prepare() {

}

func (c *LoginController) Login() {

	userID := c.GetString("userID")
	passWD := c.GetString("passwd")
	code := c.GetString("Code")

	dataJSON := new(datas.KeyDataJSON)

	valid := validation.Validation{}

	if v := valid.Required(userID, "userID"); !v.Ok {
		dataJSON.Key = v.Error.Key
		dataJSON.Msg = "手机号不能为空！"
	} else if v := valid.Required(passWD, "passWD"); !v.Ok {
		dataJSON.Key = v.Error.Key
		dataJSON.Msg = "登录密码不能为空！"
	} else if v := valid.Length(code, common.VERIFY_CODE_LEN, "code"); !v.Ok {
		dataJSON.Key = v.Error.Key
		dataJSON.Msg = "验证码不正确！"
	}

	userInfo := user.GetUserInfoByUserID(userID)

	if userInfo.UserId == "" {
		dataJSON.Key = "userID"
		dataJSON.Msg = "用户不存在，请求联系管理员！"
	} else {
		codeInterface := c.GetSession("verifyCode")
		if userInfo.Passwd != utils.GetMD5Upper(passWD) {
			dataJSON.Key = "passWD"
			dataJSON.Msg = "密码不正确！"
		} else if codeInterface == nil {
			dataJSON.Key = "code"
			dataJSON.Msg = "验证码失效！"
		} else if code != codeInterface.(string) {
			dataJSON.Key = "code"
			dataJSON.Msg = "验证码不正确！"
		} else if userInfo.Status == common.UNACTIVE {
			dataJSON.Key = common.UNACTIVE
			dataJSON.Msg = "用户已被冻结！"
		} else if userInfo.Status == "del" {
			dataJSON.Key = "del"
			dataJSON.Msg = "用户已被删除！"
		}
	}

	go func() {
		userInfo.Ip = c.Ctx.Input.IP()
		user.UpdateUserInfoIP(userInfo)
	}()

	if dataJSON.Key == "" {
		_ = c.SetSession("userID", userID)
		_ = c.DelSession("verifyCode")
	}

	c.Data["json"] = dataJSON
	_ = c.ServeJSON()
}

/*
* 退出登录,删除session中的数据，避免数据量过大，内存吃紧
 */

func (c *LoginController) Logout() {
	dataJSON := new(datas.BaseDataJSON)

	_ = c.DelSession("userID")
	dataJSON.Code = 200

	c.Data["json"] = dataJSON
	_ = c.ServeJSON()
}

/*
* 验证码获取，如果获取成功，并将验证码存到session中
 */
func (c *LoginController) GetVerifyImg() {
	Image, verifyCode := utils.GenerateVerifyCodeImg()
	if Image == nil || len(verifyCode) != common.VERIFY_CODE_LEN {
		logs.Error("获取验证码图片失败！")
	} else {
		_ = c.SetSession("verifyCode", verifyCode)
	}
	logs.Info("验证码：", verifyCode)
	if Image == nil {
		logs.Error("生成验证码失败！")
	} else {
		_, _ = Image.WriteTo(c.Ctx.ResponseWriter)
	}
}
