package sysmodel

import (
	"go-admin/common/const/enum/businesstype"
	statuscode "go-admin/common/status_code"
	"go-admin/pkg/emailhelper"
	"go-admin/pkg/utility"
)

/**
 * 验证器模型
 */

// 验证器状态
var AuthNotBound = 0   // 未绑定
var AuthBoundOpen = 1  // 绑定开启
var AuthBoundClose = 2 // 绑定未开启

// GetGoogleSecretResp 获取 Google 验证器秘钥
type GetGoogleSecretResp struct {
	Secret     string `json:"secret"`
	GoogleAuth string `json:"google_auth"`
}

// UserAuthSwitchStatus 用户身份验证器开关状态
type UserAuthSwitchStatus struct {
	PhoneAuth    int    `db:"phoneauthisopen"`    // 手机验证器：0 关，1 开
	EmailAuth    int    `db:"emailauthisopen"`    // 邮箱验证器：0 关，1 开
	GoogleAuth   int    `db:"googleidcardisopen"` // 谷歌验证器：0 关，1 开
	GoogleSecret string `db:"googlesecret"`       // 谷歌秘钥
}

// Authenticator 验证器-验证结构
type Authenticator struct {
	UserID        int
	PhoneAuth     int                       // 手机验证器：0 关，1 开
	EmailAuth     int                       // 邮箱验证器：0 关，1 开
	GoogleAuth    int                       // 谷歌验证器：0 关，1 开
	Phone         string                    // 手机号
	Email         string                    // 邮箱
	GoogleSecret  string                    // 谷歌秘钥
	SmsCaptcha    string                    // 手机验证码
	EmailCaptcha  string                    // 邮箱验证码
	GoogleCaptcha string                    // 谷歌验证码
	BusinessType  businesstype.BusinessType // 业务类型
}

// AuthenticatorSwitch 身份验证开关【请求】结构
type AuthenticatorSwitch struct {
	OperationType    int                       `json:"operation_type"`     // 操作类型：1-开启，2-更改，3-关闭
	ValidatorType    int                       `json:"validator_type"`     // 验证器类型：1-手机，2-邮箱，3-Google
	SmsCaptcha       string                    `json:"sms_captcha"`        // 手机验证码
	EmailCaptcha     string                    `json:"email_captcha"`      // 邮箱验证码
	GoogleCaptcha    string                    `json:"google_captcha"`     // 谷歌验证码
	NewPhoneArea     string                    `json:"new_phone_area"`     // 新区号：开启、更改手机验证器时必传
	NewPhone         string                    `json:"new_phone"`          // 新手机号：开启、更改手机验证器时必传
	NewPhoneCaptcha  string                    `json:"new_phone_captcha"`  // 新手机验证码
	NewEmail         string                    `json:"new_email"`          // 新邮箱：开启、更改邮箱验证器时必传
	NewEmailCaptcha  string                    `json:"new_email_captcha"`  // 新邮箱验证码：开启、更改邮箱验证器时必传
	NewGoogleCaptcha string                    `json:"new_google_captcha"` // 新邮箱验证码：开启、更改邮箱验证器时必传
	UserID           int                       `json:"-"`                  //
	BusinessType     businesstype.BusinessType `json:"-"`                  // 业务类型：11-开启手机验证，21-更改手机验证，31-关闭手机验证，12-开启邮箱验证，22-更改邮箱验证，32-关闭邮箱验证，13-开启Google验证，23-更改Google验证，33-关闭Google验证
}

func (self *AuthenticatorSwitch) Valid() int {
	// 计算业务类型
	self.BusinessType = businesstype.BusinessType(self.OperationType*10 + self.ValidatorType)

	switch self.BusinessType {

	case businesstype.OpenPhoneAuth, businesstype.ChangePhoneAuth: // 开启手机 & 更改手机
		if self.NewPhoneArea == "" {
			return statuscode.PleaseSelectThePhoneAreaCode
		}
		if self.NewPhone == "" {
			return statuscode.PhoneRequired
		}
		if self.NewPhoneCaptcha == "" {
			return statuscode.PhoneCaptchaRequired
		}

		if self.NewPhoneArea == "86" {
			if !utility.IsMobileChina(self.NewPhone) {
				return statuscode.PhoneFormatInvalid
			}
		} /*else {
			if !utility.ValidatePhoneNumber(self.NewPhone) {
				return enum.Differentarea
			}
		}*/

		return statuscode.OK

	case businesstype.ClosePhoneAuth: // 关闭手机

	case businesstype.OpenEmailAuth, businesstype.ChangeEmailAuth: // 开启邮箱 & 更改邮箱
		if self.NewEmail == "" {
			return statuscode.EmailRequired
		}
		if self.NewEmailCaptcha == "" {
			return statuscode.EmailCaptchaRequired
		}

		if !emailhelper.CheckIsEmail(self.NewEmail) {
			return statuscode.EmailFormatInvalid
		}

		return statuscode.OK

	case businesstype.CloseEmailAuth: // 关闭邮箱

	case businesstype.OpenGoogleAuth: // 开启 Google
		if self.NewGoogleCaptcha == "" {
			return statuscode.GoogleCaptchaRequired
		}
	case businesstype.ChangeGoogleAuth: // 更改 Google 实质就是关闭，但业务类型要区分开
	case businesstype.CloseGoogleAuth: // 关闭 Google

	default:
		return statuscode.UnsupportedBusinessType
	}

	return statuscode.OK
}
