package service

import (
	"github.com/linmadan/egglib-go/core/application"
	"github.com/tiptok/gocomm/gs"
	"gitlab.fjmaimaimai.com/mmm-go-pp/partner01-gateway/pkg/application/auth/command"
	"gitlab.fjmaimaimai.com/mmm-go-pp/partner01-gateway/pkg/application/auth/query"
	"gitlab.fjmaimaimai.com/mmm-go-pp/partner01-gateway/pkg/infrastructure/gateway"
)

// 认证服务
type AuthService struct {
}

// 用户按公司登录
func (authService *AuthService) AccessToken(accessTokenCommand *command.AccessTokenCommand) (interface{}, error) {
	if err := accessTokenCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsAccessToken, gs.WithJsonObject(accessTokenCommand))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

// 修改手机号密码
func (authService *AuthService) ChangePassword(changePasswordCommand *command.ChangePasswordCommand) (interface{}, error) {
	if err := changePasswordCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsChangePhonePassword, gs.WithJsonObject(changePasswordCommand))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

// 用户登录 返回有权限的公司列表
func (authService *AuthService) Login(loginQuery *query.LoginQuery) (interface{}, error) {
	if err := loginQuery.ValidateQuery(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsLogin, gs.WithJsonObject(loginQuery))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

// 用户按公司登录
func (authService *AuthService) LoginByCompany(loginByCompanyCommand *command.LoginByCompanyCommand) (interface{}, error) {
	if err := loginByCompanyCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsLoginByCompany, gs.WithJsonObject(loginByCompanyCommand))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

// 更新授权令牌accessToken
func (authService *AuthService) RefreshToken(refreshTokenCommand *command.RefreshTokenCommand) (interface{}, error) {
	if err := refreshTokenCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsRefreshToken, gs.WithJsonObject(refreshTokenCommand))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

// 注销登录
func (authService *AuthService) Revoke(revokeCommand *command.RevokeCommand) (interface{}, error) {
	if err := revokeCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsRevoke, gs.WithJsonObject(revokeCommand))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

// 发送验证码
func (authService *AuthService) SendSmsCode(sendSmsCodeCommand *command.SendSmsCodeCommand) (interface{}, error) {
	if err := sendSmsCodeCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	data, err := gateway.Partner01Service.Invoke(gateway.AuthsSendSmsCode, gs.WithJsonObject(sendSmsCodeCommand))
	if err != nil {
		return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
	}
	return data.Data, nil
}

func NewAuthService(options map[string]interface{}) *AuthService {
	newAuthService := &AuthService{}
	return newAuthService
}