package v1

import (
	"encoding/json"
	"github.com/astaxie/beego"
	"opp/controllers"
	"opp/protocol"
	"opp/services/auth"

	"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
)

//var (
//	auth s_auth.IAuthService = &s_auth.AuthService{}
//)

type AuthController struct {
	controllers.BaseController
}

// Login
// @router /loginModule [post]
func (this *AuthController) Login() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.LoginRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := controllers.GetRequestHeader(this.Ctx)
	if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "test" {
		msg = protocol.NewReturnResponse(auth.LoginV3(header, request))
		return
	}
	msg = protocol.NewReturnResponse(auth.Login(header, request))
}

//Authorize 模块认证 (登录V2版本)
// @router /authorize [post]
func (this *AuthController) Authorize() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.AuthorizeRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := controllers.GetRequestHeader(this.Ctx)
	msg = protocol.NewReturnResponse(auth.Authorize(header, request))
}

//SmsCode
// @router /smsCode [post]
func (this *AuthController) SmsCode() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.SmsCodeRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	msg = protocol.NewReturnResponse(auth.SmsCode(request))
}

//AccessToken
// @router /accessToken [post]
func (this *AuthController) AccessToken() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.AccessTokenRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	msg = protocol.NewReturnResponse(auth.AccessToken(request))
}

//RefreshToken
// @router /refreshToken [post]
func (this *AuthController) RefreshToken() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.RefreshTokenRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	msg = protocol.NewReturnResponse(auth.RefreshToken(request))
}

//Revoke
//@router /revoke [post]
func (this *AuthController) Revoke() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.RevokeRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := controllers.GetRequestHeader(this.Ctx)
	msg = protocol.NewReturnResponse(auth.Revoke(header, request))
}

//UpdateDevice
//@router /updateDevice [post]
func (this *AuthController) UpdateDevice() {
	var msg *protocol.ResponseMessage
	defer func() {
		this.Resp(msg)
	}()
	var request *protocol.UpdateDeviceRequest
	if err := json.Unmarshal(this.ByteBody, &request); err != nil {
		log.Error(err)
		msg = protocol.BadRequestParam(1)
		return
	}
	if b, m := this.Valid(request); !b {
		msg = m
		return
	}
	header := controllers.GetRequestHeader(this.Ctx)
	msg = protocol.NewReturnResponse(auth.UpdateDevice(header, request))
}