//
//  KGSession.h
//  KakaoGame SDK
//
//  Created by Ronaldo Kim on 2016. 9. 19..
//  Copyright (c) 2016. Kakao Corp. All rights reserved.
//

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

/**
 * @brief KGSession클래스는 카카오 게임 서비스로의 로그인, 로그아웃, 탈퇴, 계정 전환, 연결 중단, 재연결등의 기능을 제공한다.
 */
@interface KGSession : NSObject

/**
 * @brief 카카오 게임 SDK를 초기화한다.
 *
 * @param appDelegateClassName appDelegate 클래스 이름.
 */
+ (void)initializeSDKWithAppDelegateClassName:(NSString *)appDelegateClassName;

/**
 * @brief 카카오 게임 SDK를 초기화한다. 만약 이전 인증 정보가 있으면 자동 로그인을 수행한다.<br>
 *
 * @param completionHandler 완료 핸들러 [error:초기화 결과].
 */
+ (void)startWithCompletionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 카카오 게임 SDK를 parameter로 받은 appId값으로 초기화한다. 만약 이전 인증 정보가 있으면 자동 로그인을 수행한다.<br>
 *
 * @param appId 유저가 선택한 appId값
 * @param completionHandler 완료 핸들러 [error:초기화 결과].
 */
+ (void)startWithAppId:(NSString *)appId completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 카카오 게임 SDK를 parameter로 받은 appId값으로 초기화한다.<br>
 *
 * @param completionHandler 완료 핸들러 [error:초기화 결과].
 */
+ (void)loadAppInfosWithCompletionHandler:(void(^)(NSError *error, NSArray *appInfos))completionHandler;

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

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

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

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

/**
 * @brief 카카오 게임 서비스의 연결 복구를 요청한다.<br>
 * 앱이 백그라운드에서 포그라운드로 전환될 때, 호출하도록 한다.
 *
 * @param completionHandler 완료 핸들러 [error:Resume 결과].
 */
+ (void)resumeWithCompletionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 카카오 게임 서비스의 연결 중단을 요청한다.<br>
 * 앱이 포그라운드에서 백그라운드로 전환될 때, 호출하도록 한다.
 */
+ (void)pause;

/**
 * @brief 카카오 게임 서비스의 로그인 여부를 반환한다.
 *
 * @return 카카오 게임 서비스에 로그인이 된 상태이면, YES를 반환한다. 아니면, NO를 반환한다.
 */
+ (BOOL)isLoggedIn;

/**
 * @brief 카카오 게임 서비스의 액세스 토큰을 반환한다.
 *
 * @return 액세스 토큰.
 */
+ (NSString *)accessToken;

/**
 * @brief 카카오 게임 서비스로 요청을 보낸다.
 *
 * @param uri 요청을 보낼 주소.
 * @param header 요청 헤더.
 * @param body 요청 바디.
 * @param timeout 타임아웃 시간.
 * @param completionHandler 완료 핸들러 [error:요청 결과][responseDic:요청에 대한 응답].
 */
+ (void)requestWithUri:(NSString *)uri
                header:(NSDictionary *)header
                  body:(NSDictionary *)body
               timeout:(NSTimeInterval)timeout
     completionHandler:(void(^)(NSError *error, NSDictionary* responseDic))completionHandler;

/**
 * @brief 온라인 푸시 알림을 등록한다.<br>
 * 등록된 리스너를 통해, 카카오 게임 서비스로 부터 전달되는 데이터를 받는다.
 *
 * @param listener 등록할 리스너 [dataDic:카카오 게임 서비스가 전달하는 데이터].
 */
+ (void)registerOnlineNotificationListener:(void(^)(NSDictionary* dataDic))listener;

/**
 * @brief 온라인 푸시 알림을 해제한다.<br>
 * 등록된 리스너를 해제한다.
 *
 * @param listener 해제할 리스너 [dataDic:카카오 게임 서비스가 전달하는 데이터].
 */
+ (void)unregisterOnlineNotificationListener:(void(^)(NSDictionary* dataDic))listener;

/**
 * @brief 사용자의 디바이스 푸시 허용 알림을 등록한다.<br>
 * 등록된 리스너를 통해, 디바이스 푸시 허용 여부 및 카카오 게임 약관 동의 여부 데이터를 받는다.
 *
 * @param listener 등록할 리스너 [dataDic:카카오 게임 서비스가 전달하는 디바이스 푸시 허용 여부 및 약관 동의 여부].
 */
+ (void)registerRemoteNotificationSettingsListener:(void(^)(NSDictionary* dataDic))listener;

/**
 * @brief 온라인 푸시 알림을 등록한다.<br>
 * 등록된 리스너를 해제한다.
 *
 * @param listener 등록할 리스너 [dataDic:카카오 게임 서비스가 전달하는 데이터].
 */
+ (void)unregisterRemoteNotificationSettingsListener:(void(^)(NSDictionary* dataDic))listener;

/**
 * @brief 마켓 환불로 인해 제재 받았을 경우 게임에서 처리할 마켓 환불 정보 리스트를 리턴한다.
 *
 * @return 마켓 환불 정보 리스트.
 */
+ (NSArray *)marketRefundInfoList;

@end
