package sysmodel

import (
	statuscode "go-admin/common/status_code"
	"go-admin/pkg/emailhelper"
	"go-admin/pkg/utility"
	"time"

	log "github.com/go-admin-team/go-admin-core/logger"
)

/**
 * 验证码模型
 */

var TSmsCode = 1                         // 手机验证码
var TEmailCode = 2                       // 邮箱验证码
var CodeValidTime = 5 * 60 * time.Second // 验证码有效期 5min

// SendCaptchaReq 发送验证码
type SendCaptchaReq struct {
	BusinessType  int    `json:"business_type"`   // 业务类型：1-注册，2-登录，3-找回密码，4-修改密码，11-开启手机验证，21-更改手机验证，31-关闭手机验证，12-开启邮箱验证，22-更改邮箱验证，32-关闭邮箱验证，13-开启Google验证，23-更改Google验证，33-关闭Google验证  100-手机验证码 101
	SendType      int    `json:"send_type"`       // 发送验证码类型 1 手机 2 邮箱
	IsNew         int    `json:"is_new"`          // 更改手机、邮箱验证时，新号码获取验证码需传 is_new: 1
	PhoneAreaCode string `json:"phone_area_code"` // 区域电话代码
	Phone         string `json:"phone"`           // 手机号码
	Email         string `json:"email"`           // 邮箱地址
	Uid           int    `json:"-"`               // 存用户ID用于判断是否登录，从token中解析得到，而非传入
	IP            string `json:"-"`               // IP
	Receive       string `json:"-"`               // 验证码接收方
}

func (self *SendCaptchaReq) Valid() int {
	// 业务类型不能为空
	if self.BusinessType <= 0 {
		log.Error("send verify code business info unknown")
		return statuscode.ParameterInvalid
	}
	// 业务类型 1 注册 2 登录 3 找回密码 无须登录，其余业务须登录
	if self.BusinessType > 3 && self.Uid == 0 {
		return statuscode.NotLoggedIn
	}

	// 发送手机验证码
	if self.SendType == TSmsCode {
		// 区域电话代码不能为空
		if self.PhoneAreaCode == "" {
			return statuscode.PleaseSelectThePhoneAreaCode
		}

		// 电话号码不能为空
		if self.Phone == "" {
			return statuscode.PhoneRequired
		}

		// 校验手机号码是否合法
		if self.PhoneAreaCode == "86" {
			if !utility.IsMobileChina(self.Phone) {
				return statuscode.PhoneFormatInvalid
			}
		} /*else {
			if !utility.ValidatePhoneNumber(self.Phone) {
				return enum.Differentarea
			}
		}*/

		// 接收方
		self.Receive = self.Phone

	} else if self.SendType == TEmailCode { // 发送邮箱验证码
		// 邮箱不能为空
		if self.Email == "" {
			return statuscode.EmailRequired
		}

		// 校验邮箱是否合法
		if !emailhelper.CheckIsEmail(self.Email) {
			return statuscode.EmailFormatInvalid
		}

		// 接收方
		self.Receive = self.Email

	} else {
		log.Error("only support phone and email auth")
		return statuscode.ParameterInvalid
	}

	return statuscode.OK
}

// CaptchaEmbedded 校验验证码的嵌入结构
type CaptchaEmbedded struct {
	SmsCaptcha    string `json:"sms_captcha"`    // 手机验证码
	EmailCaptcha  string `json:"email_captcha"`  // 邮箱验证码
	GoogleCaptcha string `json:"google_captcha"` // 谷歌验证码
}

// CheckCaptcha 校验验证码
type CheckCaptcha struct {
	BusinessType int       `db:"businesstype"` // 业务类型
	Receive      string    `db:"phone"`        // 接收方, 手机或邮箱
	Captcha      string    `db:"code"`         // 验证码
	Flag         int       `db:"verifyflag"`   // 标志：0-未验证，1-已验证
	Now          time.Time `db:"now"`
}

// Credential 验证码校验通过生成凭证
type Credential struct {
	BusinessType int    // 业务类型
	UserID       int    // 用户ID
	Phone        string // 手机
	Email        string // 邮箱
	Time         int64  // 凭证生成时间戳
	Rand         int64  // 随机种子
}
