package cn.ey.biz.module.system.service.auth;

import cn.ey.biz.framework.third.auth.oauth.model.AuthUser;
import cn.ey.biz.module.system.controller.admin.auth.vo.AuthLoginRespVO;
import cn.ey.biz.module.system.controller.admin.auth.vo.ThirdAuthCallBackReqVO;
import cn.ey.biz.module.system.controller.admin.auth.vo.ThirdAuthLoginReqVO;
import cn.ey.biz.module.system.enums.social.SocialTypeEnum;

import javax.validation.Valid;

/**
 * 第三方平台的认证 Service 接口
 *
 * 提供回调、登录、登出的能力
 *
 */
public interface ThirdAuthService {

    /**
     * 账号登录
     *
     * @param platform 登录信息
     * @return 登录结果
     */
    AuthLoginRespVO login(Integer platform, @Valid ThirdAuthCallBackReqVO reqVo);

    /**
     * 账号登录
     *
     * @param reqVo 登录信息
     * @return 登录结果
     */
    AuthLoginRespVO login02(@Valid ThirdAuthLoginReqVO reqVo);

    /**
     * 账号登录
     *
     * @param reqVo 登录信息
     * @return 登录结果
     */
    AuthLoginRespVO login03(@Valid ThirdAuthLoginReqVO reqVo);

    /**
     * 取消授权登录
     *
     * @param platform 第三方平台的类型 {@link SocialTypeEnum}
     * @param accessToken 访问令牌
     * @return 登录结果
     */
    String logout(Integer platform, String accessToken);

    /**
     * 刷新访问令牌
     *
     * @param platform 第三方平台的类型 {@link SocialTypeEnum}
     * @param refreshToken 刷新令牌
     * @return 登录结果
     */
    AuthLoginRespVO refreshToken(Integer platform, String refreshToken);

    /**
     * 获得第三方平台的授权 URL
     *
     * @param platform 第三方平台的类型 {@link SocialTypeEnum}
     * @param redirectUri 跳转地址
     * @param app 应用来源
     * @return 第三方平台的授权 URL
     */
    String getAuthorizeUrl(Integer platform, String redirectUri, String app);

    /**
     * 获得第三方平台的授权 URL
     *
     * @param platform 第三方平台的类型 {@link SocialTypeEnum}
     * @param code
     * @param state
     * @return 登录用户
     */
    AuthUser callback(Integer platform, String code, String state);

    /**
     * 获得第三方平台的授权 URL
     *
     * @param platform 第三方平台的类型 {@link SocialTypeEnum}
     * @param code
     * @param state
     * @return 唯一标识
     */
    String callback02(Integer platform, String code, String state);

}
