//
//  KGSessionForCustomUI.h
//  KakaoGame SDK
//
//  Created by Bruce Lee on 2017. 2. 15..
//  Copyright (c) 2017. Kakao Corp. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "KGIdpProfile.h"
#import "KGKakaoAuthTypes.h"

/**
 * @brief 계정 연결 모드를 위한 Enum.
 */
typedef NS_ENUM(NSInteger, KGIdpChoiceMode)
{
	KGIdpChoiceModeCurrentAccount,				/**< 계정 연결을 진행하지 않고 현재 계정을 사용하는 모드. */
	KGIdpChoiceModeAlreadyConnectedAccount		/**< 이미 playerId가 있는 IDP 계정으로 전환하는 모드 */
};

/**
 * @brief KGSessionForCustomUI 클래스는 카카오 게임 서비스로의 로그인, 로그아웃, 탈퇴, 계정 전환등에 커스텀UI를 사용하는 기능을 제공한다.
 */
@interface KGSessionForCustomUI : NSObject

/**
 * @brief 카카오 게임 서비스의 로그인을 요청한다.
 *
 * @param idpCode 로그인을 시도할 IDP서비스
 * @param completionHandler 완료 핸들러 [error:로그인 결과].
 */
+ (void)loginWithIdpCode:(KGIdpCode)idpCode completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 카카오 계정으로 로그인할 때 원하는 타입으로 로그인을 요청한다.
 *
 * @param authType 로그인을 수행할 타입 코드.
 * @param completionHandler 완료 핸들러 [error:로그인 결과].
 */
+ (void)loginKakaoWithKakaoAuthType:(KGKakaoAuthType)authType completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 게스트, 구글, 애플게임센터로 인증된 계정에 다른 IDP 계정 전환을 요청한다.<br>
 * 게스트, 구글, 애플게임센터 로그인 계정만 다른 IDP로 계정 전환이 가능하다. 만약 게스트, 구글, 애플게임센터 로그인 상태가 아니라면, 계정 전환에 실패한다.<br>
 * 이미 사용중인 IDP 계정으로 전환을 시도한 경우, 계정 전환에 실패한다.
 *
 * @param idpCode 전환을 시도할 IDP서비스
 * @param completionHandler 완료 핸들러 [error:계정 전환 결과].
 */
+ (void)connectWithIdpCode:(KGIdpCode)idpCode completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 게스트, 구글, 애플게임센터로 인증된 계정에 카카오 IDP 계정에 원하는 타입으로 연결을 요청한다.<br>
 * 게스트, 구글, 애플게임센터 로그인 계정만 다른 IDP로 계정 전환이 가능하다. 만약 게스트, 구글, 애플게임센터 로그인 상태가 아니라면, 계정 전환에 실패한다.<br>
 * 이미 사용중인 IDP 계정으로 전환을 시도한 경우, 계정 전환에 실패한다.
 *
 * @param authType 로그인을 수행할 타입 코드.
 * @param completionHandler 완료 핸들러 [error:로그인 결과].
 */
+ (void)connectKakaoWithKakaoAuthType:(KGKakaoAuthType)authType completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 게스트, 구글, 애플게임센터로 인증된 계정에 다른 IDP 계정 전환을 요청한다.<br>
 * 게스트, 구글, 애플게임센터 로그인 계정만 다른 IDP로 계정 전환이 가능하다. 만약 게스트, 구글, 애플게임센터 로그인 상태가 아니라면, 계정 전환에 실패한다.<br>
 * 이미 사용중인 IDP 계정으로 전환을 시도한 경우, 계정 전환에 실패 하지만 IDP Logout을 수행하지 않는다.
 * 이 API는 chooseIdpAccount API를 사용하여 기존 계정으로 계속 진행할지, 아니면 playerId가 있는 IDP계정으로 변환할지 처리해야 한다.
 *
 * @param idpCode 전환을 시도할 IDP서비스
 * @param completionHandler 완료 핸들러 [error:계정 전환 결과].
 */
+ (void)connectIdpAccountWithIdpCode:(KGIdpCode)idpCode completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 계정 전환 실패 후에 유저에게 처리할 수 있도록 방법을 제공하는 API이다.<br>
 * KGIdpChoiceModeCurrentAccount를 선택하면 계정전환을 진행하지 않고 현재 계정으로 계속 플레이한다.<br>
 * KGIdpChoiceModeAlreadyConnectedAccount를 선택하면 이미 사용중인 IDP계정으로 전환하여 로그인을 처리한다.
 *
 * @param idpChoiceMode idp 전환 모드
 * @param completionHandler 완료 핸들러 [error:계정 전환 결과].
 */
+ (void)chooseIdpAccountWithIdpChoiceMode:(KGIdpChoiceMode)idpChoiceMode completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 카카오 게임 서비스의 로그아웃을 요청한다.
 *
 * @param completionHandler 완료 핸들러 [error:로그아웃 결과].
 */
+ (void)logoutWithCompletionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 카카오 게임 서비스의 탈퇴를 요청한다.
 *
 * @param completionHandler 완료 핸들러 [error:탈퇴 결과].
 */
+ (void)unregisterWithCompletionHandler:(void(^)(NSError *error))completionHandler;

@end
