package sysmodel

import (
	statuscode "go-admin/common/status_code"
	"go-admin/pkg/cryptohelper/md5helper"
	"go-admin/pkg/emailhelper"

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

	"go-admin/pkg/utility"
)

type FrontedUserRegisterReq struct {
	Account       string `json:"account"`         // 账号
	RegisterType  int    `json:"register_type"`   // 注册类型 1: 手机 2: 邮箱
	PhoneAreaCode string `json:"phone_area_code"` // 区域电话代码
	Phone         string `json:"phone"`           // 手机号码
	Captcha       string `json:"captcha"`         // 验证码：携带验证码注册
	Email         string `json:"email"`           // 邮箱地址
	Password      string `json:"password"`        // 密码
	CheckPassword string `json:"check_password"`  // 确认密码
	InviteCode    string `json:"invite_code"`     // 邀请码
	IP            string `json:"-"`               // IP
	Pid           int    `json:"-"`               // 推荐人ID
	Language      string `json:"-"`               //语言
}

// CheckParams 校验邮箱参数
func (i *FrontedUserRegisterReq) CheckParams() int {
	if i.RegisterType == TSmsCode {
		if i.Phone == "" {
			return statuscode.PhoneRequired
		}
		if i.PhoneAreaCode == "+86" {
			if !utility.IsMobileChina(i.Phone) {
				return statuscode.PhoneFormatInvalid
			}
		}
		i.Account = i.Phone

	} else if i.RegisterType == TEmailCode {
		// 邮箱校验
		if i.Email == "" {
			return statuscode.EmailRequired
		}
		if !emailhelper.CheckIsEmail(i.Email) {
			return statuscode.EmailFormatInvalid
		}
		i.Account = i.Email
	} else {
		log.Error("only support email and phone register")
		return statuscode.ParameterInvalid
	}
	return statuscode.OK
}

/**
 * 身份认证模型
 */

// UserRegisterReq 用户注册
type UserRegisterReq struct {
	Account        string `json:"account"`         // 账号
	RegisterType   int    `json:"register_type"`   // 注册类型 1: 手机 2: 邮箱
	PhoneAreaCode  string `json:"phone_area_code"` // 区域电话代码
	Phone          string `json:"phone"`           // 手机号码
	Email          string `json:"email"`           // 邮箱地址
	Password       string `json:"password"`        // 密码
	Captcha        string `json:"captcha"`         // 验证码：1-不带验证码注册，仅验证注册信息是否合法；2-携带验证码注册，成功后返回 token
	InviteCode     string `json:"invite_code"`     // 邀请码
	UserAddress    string `json:"user_address"`    // 地址
	Receive        string `json:"-"`               // 验证码接收方
	PhoneBindState int    `json:"-"`               // 手机绑定状态
	EmailBindState int    `json:"-"`               // 邮箱绑定状态
	IP             string `json:"-"`               // IP
	Source         int    `json:"-"`               // 来源：0-未知，1-Android，2-iOS，3-PC
	AgentCode      string `json:"agent_code"`      // 代理邀请码
	AreaId         int    `json:"areaid"`          // 地区序号
}

func (i *UserRegisterReq) Valid() int {
	// 注册类型
	if i.RegisterType == TSmsCode {
		// 手机校验
		if i.PhoneAreaCode == "" {
			return statuscode.PleaseSelectThePhoneAreaCode
		}
		if i.Phone == "" {
			return statuscode.PhoneRequired
		}
		if i.PhoneAreaCode == "86" {
			if !utility.IsMobileChina(i.Phone) {
				return statuscode.PhoneFormatInvalid
			}
		} /*else {
			if !utility.ValidatePhoneNumber(i.Phone) {
				return statuscode.Differentarea
			}
		}*/

		i.Account = i.Phone
		i.Receive = i.Phone
		i.PhoneBindState = AuthBoundOpen

	} else if i.RegisterType == TEmailCode {
		// 邮箱校验
		if i.Email == "" {
			return statuscode.EmailRequired
		}
		if !emailhelper.CheckIsEmail(i.Email) {
			return statuscode.EmailFormatInvalid
		}

		i.Account = i.Email
		i.Receive = i.Email
		i.EmailBindState = AuthBoundOpen

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

	// 密码校验
	if i.Password == "" {
		return statuscode.PasswordRequired
	}
	if !utility.CheckPasswordOk(8, 32, i.Password) {
		return statuscode.PasswordRules
	}
	// 加密密码
	i.Password = md5helper.MD52(i.Password)

	return statuscode.OK
}

// TokenResp 注册成功，返回 token
type TokenResp struct {
	JwtToken  string `json:"jwt_token"`
	JwtExpire string `json:"jwt_expire"`
}

// UserAccountPwdLoginReq 用户账号密码登录
type UserAccountPwdLoginReq struct {
	LoginType       int    `json:"login_type"`      // 1 手机，2 邮箱
	PhoneAreaCode   string `json:"phone_area_code"` // 区域电话代码
	Phone           string `json:"phone"`           // 手机号码
	Email           string `json:"email"`           // 邮箱
	Password        string `json:"password"`        // 密码
	CaptchaEmbedded        // 嵌入验证码
	LoginIP         string `json:"-"`         // IP
	Source          int    `json:"-"`         // 来源：0-未知，1-Android，2-iOS，3-PC
	DeviceID        string `json:"-"`         // 设备ID
	TimeStamp       string `json:"sessionId"` //时间戳
}
type UserRefreshTokenReq struct {
	RefreshKey  string `json:"refresh_key"`  // 刷新token的key
	RefreshTime string `json:"refresh_time"` // 刷新时间戳
}

func (l *UserAccountPwdLoginReq) Valid() int {
	// 登录类型
	if l.LoginType == TSmsCode {
		// 手机校验
		if l.PhoneAreaCode == "86" {
			if !utility.IsMobileChina(l.Phone) {
				return statuscode.PhoneFormatInvalid
			}
		} /*else {
			if !utility.ValidatePhoneNumber(l.Phone) {
				return statuscode.Differentarea
			}
		}*/
	} else if l.LoginType == TEmailCode {
		// 邮箱校验
		if !emailhelper.CheckIsEmail(l.Email) {
			return statuscode.EmailFormatInvalid
		}
	} else {
		return statuscode.ParameterInvalid
	}

	// 密码校验
	if len(l.Password) == 0 {
		return statuscode.PasswordRequired
	}
	l.Password = md5helper.MD52(l.Password)

	return statuscode.OK
}

// UserLoginResp 用户登录响应
type UserLoginResp struct {
	UserAccount   string `json:"user_account"`    // 账号
	AreaPhoneCode string `json:"area_phone_code"` // 区域电话代码
	PhoneNumber   string `json:"phone_number"`    // 手机
	EmailAddr     string `json:"email_addr"`      // 邮箱
	PhonePass     string `json:"phone_pass"`      // 手机加密显示
	EmailPass     string `json:"email_pass"`      // 邮箱加密显示
	IsPhoneAuth   int    `json:"is_phone_auth"`   // 是否开启手机验证 0否，1是
	IsEmailAuth   int    `json:"is_email_auth"`   // 是否开启手机验证 0否，1是
	IsGoogleAuth  int    `json:"is_google_auth"`  // 是否开启谷歌验证 0否，1是
	LoginType     int    `json:"login_type"`      // 登录类型 1 手机 2 邮箱
	IdCardState   int    `json:"id_card_state"`   // 实名认证审核状态：1未审核，2审核通过，3审核不通过4审核中
	JwtToken      string `json:"jwt_token"`       // 登录成功返回 token
	JwtExpire     string `json:"jwt_expire"`      // token过期时间
}

// 扫码登录 - 秘钥
type ScanLoginSecret struct {
	Secret   string `json:"secret"`    // 秘钥
	Status   int    `json:"status"`    // 状态：0 初始化，1 登录中，2 登录成功，-1 已过期
	Token    string `json:"token"`     // 登录成功返回
	IP       string `json:"ip"`        // 登录IP（PC）
	Position string `json:"position"`  // IP归属地
	DeviceID string `json:"device_id"` // 登录设备（PC）
	Time     int64  `json:"time"`      // 秘钥生成时间
}

// 扫码登录 - APP扫描请求参数
type ScanLoginScanReq struct {
	Secret  string `json:"secret"`  // 二维码秘钥
	Confirm int    `json:"confirm"` // 确认登录：0-查询登录状态，1-确认登录
}

// UserChangePwdReq 修改密码
type UserChangePwdReq struct {
	NewPassword     string `json:"new_password"` // 密码
	OldPassword     string `json:"old_password"` // 旧密码
	CaptchaEmbedded        // 嵌入验证码
	UserId          int    `json:"-"`
}

func (p *UserChangePwdReq) Valid() int {
	if p.OldPassword == "" {
		return statuscode.OriginalPasswordRequired
	}

	if p.NewPassword == "" {
		return statuscode.NewPasswordRequired
	}

	if !utility.CheckPasswordOk(8, 32, p.NewPassword) {
		return statuscode.PasswordRules
	}

	p.OldPassword = md5helper.MD52(p.OldPassword)
	p.NewPassword = md5helper.MD52(p.NewPassword)

	return statuscode.OK
}

// ResetPwdReq 重置密码
type ResetPwdReq struct {
	RetrieveType  int    `json:"retrieve_type"`   // 找回密码类型：1 手机，2 邮箱
	PhoneAreaCode string `json:"phone_area_code"` // 区域电话代码
	Phone         string `json:"phone"`           // 手机号码
	Email         string `json:"email"`           // 邮箱地址
	Password      string `json:"password"`        // 密码
	Credentials   string `json:"credentials"`     // 凭证
	UserID        int    `json:"-"`
}

func (self *ResetPwdReq) Valid() int {
	// 发送手机验证码
	if self.RetrieveType == 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 statuscode.Differentarea
			}
		}*/

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

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

	} else {

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

	// 传凭证时，才校验密码
	if len(self.Credentials) > 0 {
		if self.Password == "" {
			return statuscode.NewPasswordRequired
		}
		if !utility.CheckPasswordOk(8, 32, self.Password) {
			return statuscode.PasswordRules
		}

		self.Password = md5helper.MD52(self.Password)
	}

	return statuscode.OK
}

// ResetPwdResp 重置密码响应
type ResetPwdResp struct {
	RetrieveType  int    `json:"retrieve_type"`   // 找回密码类型：1 手机，2 邮箱
	Account       string `json:"account"`         // 账号
	AreaPhoneCode string `json:"area_phone_code"` // 区域电话代码
	PhoneNumber   string `json:"phone_number"`    // 手机号码
	EmailAddr     string `json:"email_addr"`      // 邮箱地址
	PhonePass     string `json:"phone_pass"`      // 手机加密显示
	EmailPass     string `json:"email_pass"`      // 邮箱加密显示
	IsPhoneAuth   int    `json:"is_phone_auth"`   // 是否绑定手机 0否，1是
	IsEmailAuth   int    `json:"is_email_auth"`   // 是否绑定邮箱 0否，1是
	IsGoogleAuth  int    `json:"is_google_auth"`  // 是否绑定谷歌验证器
}

// 重置密码安全校验
type ResetPwdCheck struct {
	RetrieveType    int    `json:"retrieve_type"`   // 找回密码类型：1 手机，2 邮箱
	PhoneAreaCode   string `json:"phone_area_code"` // 区域电话代码
	Phone           string `json:"phone"`           // 手机号码
	Email           string `json:"email"`           // 邮箱地址
	CaptchaEmbedded        // 嵌入验证码
}

func (self *ResetPwdCheck) Valid() int {
	// 发送手机验证码
	if self.RetrieveType == 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 statuscode.Differentarea
			}
		}*/

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

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

	} else {

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

	return statuscode.OK
}
