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

#import <KakaoGame/KGObject.h>

/**
 * @brief 메시지 상태를 위한 Enum.
 */
typedef NS_OPTIONS(NSInteger, KGMessageState)
{
    KGMessageStateUnread = 1 << 0,  /**< 읽지 않음. */
    KGMessageStateRead = 1 << 1,    /**< 읽음. */
    KGMessageStateExpired = 1 << 2, /**< 기간 만료됨. */
    KGMessageStateDeleted = 1 << 3, /**< 삭제됨. */
};

extern long long const KGPageKeyInit;    /**< @brief 메시지 조회를 시작할 때 전달해야 하는 페이지 키. */
extern long long const KGPageKeyEnd;     /**< @brief 더 이상 조회할 메시지가 없을 때 반환되는 페이지 키. */

extern NSString *const KGSenderIdCoupon;         /**< @brief 쿠폰 */
extern NSString *const KGSenderIdPromotion;      /**< @brief 프로모션 */
extern NSString *const KGSenderIdAchievement;    /**< @brief 도전과제 */
extern NSString *const KGSenderIdTournament;     /**< @brief TOURNAMENT */
extern NSString *const KGSenderIdNotice;         /**< @brief 공지 */
extern NSString *const KGSenderIdAdmin;          /**< @brief 운영툴 */

/**
 * @brief KGMessage클래스는 메시지 정보를 다룬다.
 */
@interface KGMessage : KGObject

/**
 * @brief 보낸 아이디.(읽기만 가능)
 */
@property (nonatomic, readonly) NSString            *senderId;

/**
 * @brief 메시지 식별자.(읽기만 가능)
 */
@property (nonatomic, readonly) NSString            *messageId;

/**
 * @brief 메시지가 속한 메시지 박스의 아이디.(읽기만 가능)
 */
@property (nonatomic, readonly) NSString            *messageBoxId;

/**
 * @brief 메시지의 상태.(읽기만 가능)
 *
 * @see KGMessageState
 */
@property (nonatomic, readonly) KGMessageState      state;

/**
 * @brief 메시지 타이틀.(읽기만 가능)
 */
@property (nonatomic, readonly) NSString            *title;

/**
 * @brief 메시지 바디.(읽기만 가능)
 */
@property (nonatomic, readonly) NSString            *body;

/**
 * @brief 메시지 메타 데이터.(읽기만 가능)
 */
@property (nonatomic, readonly) NSDictionary        *resourceMap;

/**
 * @brief 메시지에 포함된 아이템 목록.(읽기만 가능)
 */
@property (nonatomic, readonly) NSArray             *items;

/**
 * @brief 메시지를 읽은 시각. Epoch time(단위:ms).(읽기만 가능)
 */
@property (nonatomic, readonly) long long           readTime;

/**
 * @brief 메시지의 만료 시각. Epoch time(단위:ms).(읽기만 가능)
 */
@property (nonatomic, readonly) long long           expiryTime;

/**
 * @brief 메세지 등록 시각. Epoch time(단위:ms).(읽기만 가능)
 */
@property (nonatomic, readonly) long long           regTime;

/**
 * @brief 메시지 목록을 조회한다.
 *
 * @param messageBoxId 조회할 메시지 박스 아이디.
 * @param state 조회할 메시지 상태 목록.
 * @param pageKey 처음 조회할 경우는 KGPageKeyInit을 넣는다.<br>조회하면, 다음 페이지 키를 완료핸들러를 통해 받는다.<br>이 값을 넣으면 이어서 조회가 된다.
 * @param count 조회할 메시지의 개수.
 * @param completionHandler 완료 핸들러 [error:조회 결과][messages:메시지 목록][nextPageKey:다음 페이지 키. KGPageKeyEnd인 경우, 더 이상 조회할 메시지가 없음][maxCount:메시지 박스에 들어갈 수 있는 메시지의 최대 개수][totalCount:전체 메시지의 갯수].
 */
+ (void)loadMessagesWithMessageBoxId:(NSString *)messageBoxId
                               state:(KGMessageState)state
                             pageKey:(long long)pageKey
                               count:(int)count
                   completionHandler:(void(^)(NSError *error,
                                              NSArray *messages,
                                              long long nextPageKey,
                                              int maxCount,
                                              int totalCount))completionHandler;

/**
 * @brief 읽지 않은 메시지의 개수를 조회한다.
 *
 * @param messageBoxId 조회할 메시지 박스 아이디.
 * @param completionHandler 완료 핸들러 [error:조회 결과][count:읽지 않은 메시지 갯수].
 */
+ (void)loadUnreadMessageCountWithMessageBoxId:(NSString *)messageBoxId
                             completionHandler:(void(^)(NSError *error, int count))completionHandler;

/**
 * @brief 읽지 않은 메시지들을 읽은 상태로 변경 요청한다.
 *
 * @param messages 읽음 상태로 변경할 메시지 목록. KGMessage객체의 NSArray.
 * @param completionHandler 완료 핸들러 [error:변경 결과].
 */
+ (void)markAsReadMessages:(NSArray *)messages completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 메시지들의 삭제를 요청한다.
 *
 * @param messages 삭제할 메시지 목록. KGMessage객체의 NSArray.
 * @param completionHandler 완료 핸들러 [error:변경 결과].
 */
+ (void)deleteMessages:(NSArray *)messages completionHandler:(void(^)(NSError *error))completionHandler;

/**
 * @brief 우편함에 in/out 등에 대한 동작 변경을 알려준다.
 *
 */
+ (void)updateAction;

@end
