package controllers

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

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))
}

//ChangePhone
// @router /changePhone [post]
func (this *UserController) ChangePhone() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.ChangePhoneRequest
	if err := this.JsonUnmarshal(&request); err != nil {
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	if !CacheSms.IsExist(request.OldPhone) {
		msg = protocol.NewMesage(1009) //验证码失效
		return
	}
	if v := CacheSms.Get(request.OldPhone); v != nil {
		if !strings.EqualFold(fmt.Sprintf("%v", v), strings.TrimSpace(request.CaptchaCertificate)) {
			msg = protocol.NewMesage(1012) //验证码不一致
			return
		}
	} else {
		msg = protocol.NewMesage(1009) //验证码不一致
		return
	}
	header := this.GetRequestHeader(this.Ctx)
	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))
}