package controller

import (
	"fmt"

	"be.ems/src/framework/constants"
	"be.ems/src/framework/i18n"
	"be.ems/src/framework/reqctx"
	"be.ems/src/framework/resp"
	"be.ems/src/framework/utils/regular"
	"be.ems/src/modules/auth/model"
	"be.ems/src/modules/auth/service"
	systemService "be.ems/src/modules/system/service"

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

// 实例化控制层 RegisterController 结构体
var NewRegister = &RegisterController{
	registerService:    service.NewRegister,
	sysLogLoginService: systemService.NewSysLogLogin,
}

// 账号注册操作处理
//
// PATH /
type RegisterController struct {
	registerService    *service.Register          // 账号注册操作服务
	sysLogLoginService *systemService.SysLogLogin // 系统登录访问服务
}

// Register 账号注册
//
// POST /auth/register
func (s RegisterController) Register(c *gin.Context) {
	language := reqctx.AcceptLanguage(c)
	var body model.RegisterBody
	if err := c.ShouldBindJSON(&body); err != nil {
		errMsgs := fmt.Sprintf("bind err: %s", resp.FormatBindError(err))
		c.JSON(422, resp.CodeMsg(resp.CODE_PARAM_PARSER, errMsgs))
		return
	}

	// 当前请求信息
	ipaddr, location := reqctx.IPAddrLocation(c)
	os, browser := reqctx.UaOsBrowser(c)

	// 校验验证码
	err := s.registerService.ValidateCaptcha(body.Code, body.UUID)
	// 根据错误信息，创建系统访问记录
	if err != nil {
		msg := fmt.Sprintf("%s code %s", err.Error(), body.Code)
		s.sysLogLoginService.Insert(
			body.Username, constants.STATUS_NO, msg,
			[4]string{ipaddr, location, os, browser},
		)
		c.JSON(200, resp.ErrMsg(err.Error()))
		return
	}

	// 判断必传参数
	if !regular.ValidUsername(body.Username) {
		// 账号不能以数字开头，可包含大写小写字母，数字，且不少于5位
		c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errUsername")))
		return
	}
	if !regular.ValidPassword(body.Password) {
		// 登录密码至少包含大小写字母、数字、特殊符号，且不少于6位
		c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errPasswd")))
		return
	}
	if body.Password != body.ConfirmPassword {
		// 用户确认输入密码不一致
		c.JSON(200, resp.ErrMsg(i18n.TKey(language, "register.errPasswdNotEq")))
		return
	}

	// 进行注册
	userId, err := s.registerService.ByUserName(body.Username, body.Password)
	if err == nil {
		msg := i18n.TTemplate(language, "register.successMsg", map[string]any{"name": body.Username, "id": userId})
		s.sysLogLoginService.Insert(
			body.Username, constants.STATUS_YES, msg,
			[4]string{ipaddr, location, os, browser},
		)
		// 注册成功
		c.JSON(200, resp.OkMsg(i18n.TKey(language, "register.success")))
		return
	}
	c.JSON(200, resp.ErrMsg(err.Error()))
}
