//
//  UMessage.h
//  UMessage
//
//  Created by luyiyuan on 10/8/13.
//  Copyright (c) 2013 umeng.com. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>



/** String type for alias
 */
//新浪微博
UIKIT_EXTERN NSString *const kUMessageAliasTypeSina;
//腾讯微博
UIKIT_EXTERN NSString *const kUMessageAliasTypeTencent;
//QQ
UIKIT_EXTERN NSString *const kUMessageAliasTypeQQ;
//微信
UIKIT_EXTERN NSString *const kUMessageAliasTypeWeiXin;
//百度
UIKIT_EXTERN NSString *const kUMessageAliasTypeBaidu;
//人人网
UIKIT_EXTERN NSString *const kUMessageAliasTypeRenRen;
//开心网
UIKIT_EXTERN NSString *const kUMessageAliasTypeKaixin;
//豆瓣
UIKIT_EXTERN NSString *const kUMessageAliasTypeDouban;
//facebook
UIKIT_EXTERN NSString *const kUMessageAliasTypeFacebook;
//twitter
UIKIT_EXTERN NSString *const kUMessageAliasTypeTwitter;


//error for handle
extern NSString * const kUMessageErrorDomain;

typedef NS_ENUM(NSInteger, kUMessageError) {
    /**未知错误*/
    kUMessageErrorUnknown = 0,
    /**响应出错*/
    kUMessageErrorResponseErr = 1,
    /**操作失败*/
    kUMessageErrorOperateErr = 2,
    /**参数非法*/
    kUMessageErrorParamErr = 3,
    /**条件不足(如:还未获取device_token，添加tag是不成功的)*/
    kUMessageErrorDependsErr = 4,
    /**服务器限定操作*/
    kUMessageErrorServerSetErr = 5,
};


@class CLLocation;

/** UMessage：开发者使用主类（API）
 */
@interface UMessage : NSObject


///---------------------------------------------------------------------------------------
/// @name settings（most required）
///---------------------------------------------------------------------------------------

//--required

/** 绑定App的appKey和启动参数，启动消息参数用于处理用户通过消息打开应用相关信息
 @param appKey      主站生成appKey
 @param launchOptions 启动参数
 */
+ (void)startWithAppkey:(NSString *)appKey launchOptions:(NSDictionary *)launchOptions;

/** 注册RemoteNotification的类型
 @brief 开启消息推送，实际调用：[[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
 @warning 此接口只针对 iOS 7及其以下的版本，iOS 8 请使用 `registerRemoteNotificationAndUserNotificationSettings`
 @param types 消息类型，参见`UIRemoteNotificationType`
 */
+ (void)registerForRemoteNotificationTypes:(UIRemoteNotificationType)types NS_DEPRECATED_IOS(3_0, 8_0, "Please use registerRemoteNotificationAndUserNotificationSettings instead");

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
/** 注册RemoteNotification的类型
 @brief 开启消息推送，实际调用：[[UIApplication sharedApplication] registerForRemoteNotifications]和registerUserNotificationSettings;
 @warning 此接口只针对 iOS 8及其以上的版本，iOS 7 请使用 `registerForRemoteNotificationTypes`
 @param types 消息类型，参见`UIRemoteNotificationType`
 */
+ (void)registerRemoteNotificationAndUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);
#endif

/** 解除RemoteNotification的注册（关闭消息推送，实际调用：[[UIApplication sharedApplication] unregisterForRemoteNotifications]）
 @param types 消息类型，参见`UIRemoteNotificationType`
 */
+ (void)unregisterForRemoteNotifications;

/** 向友盟注册该设备的deviceToken，便于发送Push消息
 @param deviceToken APNs返回的deviceToken
 */
+ (void)registerDeviceToken:(NSData *)deviceToken;

/** 应用处于运行时（前台、后台）的消息处理
 @param userInfo 消息参数
 */
+ (void)didReceiveRemoteNotification:(NSDictionary *)userInfo;

//--optional

/** 开发者自行传入location
 @param location 当前location信息
 */
+ (void)setLocation:(CLLocation *)location;

/** 设置应用的日志输出的开关（默认关闭）
 @param value 是否开启标志，注意App发布时请关闭日志输出
 */
+ (void)setLogEnabled:(BOOL)value;

/** 设置是否允许SDK自动清空角标（默认开启）
 @param value 是否开启角标清空
 */
+ (void)setBadgeClear:(BOOL)value;

/** 设置是否允许SDK当应用在前台运行收到Push时弹出Alert框（默认开启）
 @warning 建议不要关闭，否则会丢失程序在前台收到的Push的点击统计,如果定制了 Alert，可以使用`sendClickReportForRemoteNotification`补发 log
 @param value 是否开启弹出框
 */
+ (void)setAutoAlert:(BOOL)value;

/** 设置App的发布渠道（默认为:"App Store"）
 @param channel 渠道名称
 */
+ (void)setChannel:(NSString *)channel;

/** 设置设备的唯一ID，目前友盟这边设备的唯一ID是OpenUdid，如果你们可以采集到更合适的唯一ID，可以采用这个ID来替换OpenUdid
 @warning 用户可以设置uniqueId方便以后扩展，我们短时间内在服务区端任然会采取OpenUdid作为唯一标记。
 @param uniqueId 唯一ID名称
 */
+ (void)setUniqueID:(NSString *)uniqueId;

/** 为某个消息发送点击事件
 @warning 请注意不要对同一个消息重复调用此方法，可能导致你的消息打开率飚升，此方法只在需要定制 Alert 框时调用
 @param userInfo 消息体的NSDictionary，此Dictionary是
        (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo中的userInfo
 */
+ (void)sendClickReportForRemoteNotification:(NSDictionary *)userInfo;


///---------------------------------------------------------------------------------------
/// @name tag (optional)
///---------------------------------------------------------------------------------------


/** 获取当前绑定设备上的所有tag(每台设备最多绑定64个tag)
 @warning 获取列表的先决条件是已经成功获取到device_token，否则失败(kUMessageErrorDependsErr)
 @param handle responseTags为绑定的tag
 集合,remain剩余可用的tag数,为-1时表示异常,error为获取失败时的信息(ErrCode:kUMessageError)
 */
+ (void)getTags:(void (^)(NSSet *responseTags,NSInteger remain,NSError *error))handle;

/** 绑定一个或多个tag至设备，每台设备最多绑定64个tag，超过64个，绑定tag不再成功，可`removeTag`或者`removeAllTags`来精简空间
 @warning 添加tag的先决条件是已经成功获取到device_token，否则直接添加失败(kUMessageErrorDependsErr)
 @param tag tag标记,可以为单个tag（NSString）也可以为tag集合（NSArray、NSSet），单个tag最大允许长度50字节，编码UTF-8，超过长度自动截取
 @param handle responseTags为绑定的tag集合,remain剩余可用的tag数,为-1时表示异常,error为获取失败时的信息(ErrCode:kUMessageError)
 */
+ (void)addTag:(id)tag response:(void (^)(id responseObject,NSInteger remain,NSError *error))handle;

/** 删除设备中绑定的一个或多个tag
 @warning 添加tag的先决条件是已经成功获取到device_token，否则失败(kUMessageErrorDependsErr)
 @param tag tag标记,可以为单个tag（NSString）也可以为tag集合（NSArray、NSSet），单个tag最大允许长度50字节，编码UTF-8，超过长度自动截取
 @param handle responseTags为绑定的tag集合,remain剩余可用的tag数,为-1时表示异常,error为获取失败时的信息(ErrCode:kUMessageError)
 */
+ (void)removeTag:(id)tag response:(void (^)(id responseObject,NSInteger remain,NSError *error))handle;

/** 删除设备中所有绑定的tag,handle responseObject
 @warning 删除tag的先决条件是已经成功获取到device_token，否则失败(kUMessageErrorDependsErr)
 @param handle responseTags为绑定的tag集合,remain剩余可用的tag数,为-1时表示异常,error为获取失败时的信息(ErrCode:kUMessageError)
 */
+ (void)removeAllTags:(void (^)(id responseObject,NSInteger remain,NSError *error))handle;


///---------------------------------------------------------------------------------------
/// @name alias (optional)
///---------------------------------------------------------------------------------------


/** 绑定一个别名至设备（含账户，和平台类型）
 @warning 添加Alias的先决条件是已经成功获取到device_token，否则失败(kUMessageErrorDependsErr)
 @param name 账户，例如email
 @param type 平台类型，参见本文件头部的`kUMessageAliasType...`，例如：kUMessageAliasTypeSina
 @param handle block返回数据，error为获取失败时的信息，responseObject为成功返回的数据
 */
+ (void)addAlias:(NSString *)name type:(NSString *)type response:(void (^)(id responseObject,NSError *error))handle;

/** 绑定一个别名至设备（含账户，和平台类型）,并解绑这个别名曾今绑定过的设备。
 @warning 添加Alias的先决条件是已经成功获取到device_token，否则失败(kUMessageErrorDependsErr)
 @param name 账户，例如email
 @param type 平台类型，参见本文件头部的`kUMessageAliasType...`，例如：kUMessageAliasTypeSina
 @param handle block返回数据，error为获取失败时的信息，responseObject为成功返回的数据
 */
+ (void)setAlias:(NSString *)name type:(NSString *)type response:(void (^)(id responseObject,NSError *error))handle;

/** 删除一个设备的别名绑定
 @warning 删除Alias的先决条件是已经成功获取到device_token，否则失败(kUMessageErrorDependsErr)
 @param name 账户，例如email
 @param type 平台类型，参见本文件头部的`kUMessageAliasType...`，例如：kUMessageAliasTypeSina
 @param handle block返回数据，error为获取失败时的信息，responseObject为成功返回的数据
 */
+ (void)removeAlias:(NSString *)name type:(NSString *)type response:(void (^)(id responseObject,NSError *error))handle;

@end
