package controllers

import (
	"fmt"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/auth"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/user"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
	"strings"
	"time"
)

type UserController struct {
	BaseController
}

//UserInfo
//@router /userInfo [post]
func (this *UserController) UserInfo() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.UserInfoRequest
	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(2)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := this.GetRequestHeader(this.Ctx)
	msg = protocol.NewReturnResponse(user.UserInfo(header, request))
}

//CheckSmsCode
// @router /checkSmsCode [post]
func (this *UserController) CheckSmsCode() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.CheckSmsCodeRequest
	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := this.GetRequestHeader(this.Ctx)
	msg = protocol.NewReturnResponse(user.CheckSmsCode(header, request))
}

/**
 * @Author SteveChan
 * @Description //TODO 修改手机号
 * @Date 00:29 2021/1/8
 * @Param
 * @return
 * @router /changePhone [post]
 **/
func (this *UserController) ChangePhone() {
	var msg *protocol.ResponseMessage

	defer func() {
		this.Resp(msg)
	}()

	var request *protocol.ChangePhoneRequest

	header := this.GetRequestHeader(this.Ctx)

	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}

	// 校验短信验证码
	var authCheckSmsCodeRequest *protocol.AuthCheckSmsCodeRequest
	if err := this.JsonUnmarshal(&authCheckSmsCodeRequest); err != nil {
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(authCheckSmsCodeRequest); !b {
		msg = m
		return
	}
	rsp, err := auth.AuthCheckSmsCode(header, authCheckSmsCodeRequest)
	if err != nil {
		msg = protocol.NewReturnResponse(rsp, err)
		return
	}
	err = CacheSms.Put(request.Phone, rsp.CaptchaCertificate, 5*time.Minute)
	if err != nil {
		msg = protocol.NewReturnResponse(rsp, err)
		return
	}

	if !CacheSms.IsExist(request.Phone) {
		msg = protocol.NewMesage(1009) //验证码失效
		return
	}
	if v := CacheSms.Get(request.Phone); v != nil {
		//if !strings.EqualFold(fmt.Sprintf("%v", v), strings.TrimSpace(request.CaptchaCertificate)) {
		//	msg = protocol.NewMesage(1012) //验证码不一致
		//	return
		//}
	} else {
		msg = protocol.NewMesage(1009) //验证码不一致
		return
	}

	data, err := user.ChangePhone(header, request)
	if err == nil {
		msg = protocol.NewResponseMessage(0, "修改手机号成功")
		return
	}
	msg = protocol.NewReturnResponse(data, err)
}

//ResetPassword
// @router /resetPassword [post]
func (this *UserController) ResetPassword() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.ResetPasswordRequest
	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	if len(request.NewPwd) < 6 {
		msg = protocol.BadRequestParam(2027)
		return
	}
	if !strings.EqualFold(request.NewPwd, request.ConfirmPwd) {
		msg = protocol.BadRequestParam(2026)
		return
	}

	if !CacheSms.IsExist(request.Phone) {
		msg = protocol.NewMesage(1009) //验证码失效
		return
	}
	if v := CacheSms.Get(request.Phone); v != nil {
		if !strings.EqualFold(fmt.Sprintf("%v", v), strings.TrimSpace(request.CaptchaCertificate)) {
			msg = protocol.NewMesage(1012) //验证码不一致
			return
		}
	} else {
		msg = protocol.NewMesage(1013) //验证码不一致
		return
	}

	header := this.GetRequestHeader(this.Ctx)
	data, err := user.ResetPassword(header, request)
	if err == nil {
		msg = protocol.NewResponseMessage(0, "重置密码成功")
		return
	}
	msg = protocol.NewReturnResponse(data, err)
}

//ChangePassword
// @router /changePassword [post]
func (this *UserController) ChangePassword() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.ChangePasswordRequest
	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(1)
		return
	}

	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	if strings.EqualFold(request.NewPwd, request.OldPwd) {
		msg = protocol.BadRequestParam(2030)
		return
	}
	if len(request.NewPwd) < 6 {
		msg = protocol.BadRequestParam(2027)
		return
	}
	if !strings.EqualFold(request.NewPwd, request.ConfirmPwd) {
		msg = protocol.BadRequestParam(2026)
		return
	}

	header := this.GetRequestHeader(this.Ctx)
	data, err := user.ChangePassword(header, request)
	if err == nil {
		msg = protocol.NewResponseMessage(0, "修改密码成功")
		return
	}
	msg = protocol.NewReturnResponse(data, err)
}

//UserInfo
//@router /userInfo [post]
func (this *UserController) UserInfoV2() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.UserInfoRequest
	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(2)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := this.GetRequestHeader(this.Ctx)
	msg = protocol.NewReturnResponse(user.UserInfoV2(header, request))
}