//
//  MagicWindowApi.h
//  Created by 刘家飞 on 14/11/18.
//  Copyright (c) 2014年 MagicWindow. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "MWCampaignConfig.h"
#import <CoreLocation/CoreLocation.h>
#import "MWApiObject.h"

#define DEPRECATED(_version) __attribute__((deprecated))

/**
 *  当活动有更新的时候会触发该notification
 **/
#define MWUpdateCampaignNotification            @"MWUpdateCampaignNotification"
/**
 *  活动详情页面即将打开的时候会触发
 **/
#define MWWebViewWillAppearNotification         @"MWWebViewWillAppearNotification"
/**
 *  活动详情页面关闭的时候会触发
 **/
#define MWWebViewDidDisappearNotification       @"MWWebViewDidDisappearNotification"
/**
 *  @deprecated This method is deprecated starting in version 3.66
 *  @note Please use @code MWUpdateCampaignNotification @code instead.
 **/
#define MWRegisterAppSuccessedNotification      @"MWRegisterAppSuccessedNotification"  DEPRECATED(3.66)


typedef  void (^ _Nullable CallbackWithCampaignSuccess) (NSString *__nonnull key, UIView *__nonnull view, MWCampaignConfig *__nonnull campaignConfig);
typedef void (^ _Nullable CallbackWithCampaignFailure) (NSString *__nonnull key, UIView *__nonnull view, NSString *__nullable errorMessage);
typedef  BOOL (^ CallbackWithTapCampaign) (NSString *__nonnull key, UIView *__nonnull view);
typedef void(^ _Nullable CallBackMLink)(NSURL * __nonnull url ,NSDictionary * __nullable params);
typedef  NSDictionary * _Nullable (^ CallbackWithMLinkCampaign) (NSString *__nonnull key, UIView *__nonnull view);
typedef  NSDictionary * _Nullable (^ CallbackWithMLinkLandingPage) (NSString *__nonnull key, UIView *__nonnull view);
typedef  NSDictionary * _Nullable (^ CallbackWithReturnMLink) (NSString *__nonnull key, UIView *__nonnull view);

@interface MWApi : NSObject

/**
 *  注册app
 *  需要在 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中调用
 *  @param appKey 魔窗后台注册的appkey
 *  @return void
 */
+ (void)registerApp:(nonnull NSString *)appKey;

/**
 *  设置用户基本信息
 *  @param userPhone 用户手机号
 *  @return void
 */
+ (void)setUserPhone:(nonnull NSString *)userPhone;

/**
 *  设置用户基本信息
 *  @param user MWUserProfile对象
 *  @return void
 */
+ (void)setUserProfile:(nonnull MWUserProfile *)user;

/**
 * 退出登录的时候，取消当前的用户基本信息
 */
+ (void)cancelUserProfile;

/**
 *  设置渠道,默认为appStore
 *  @param channel 渠道key
 *  @return void
 */
+ (void)setChannelId:(nonnull NSString *)channel;

/** 
 *  设置是否打印sdk的log信息,默认不开启,在release情况下，不要忘记设为NO.
 *  @param enable YES:打开,NO:关闭
 *  @return void
 */
+ (void)setLogEnable:(BOOL)enable;

/**
 *  设置是否抓取crash信息,默认开启.
 *  @param enable YES:打开,NO:关闭
 *  @return void
 */
+ (void)setCaughtCrashesEnable:(BOOL)enable;

/**
 *  @deprecated This method is deprecated starting in version 3.9
 *  @note default true
 **/
+ (void)setMlinkEnable:(BOOL)enable DEPRECATED(3.9);

/**
 * 用来获得当前sdk的版本号
 * return 返回sdk版本号
 */
+ (nonnull NSString *)sdkVersion;

#pragma mark Campaign
/**
 *  获取UserAgent
 *  当使用自己的WebView打开活动的时候，需要修改UserAgent（新UserAgent=原UserAgent + SDK的UserAgent），用作数据监测和统计
 *  @param key 魔窗位key
 *  @return SDK的UserAgent
 */
+ (nullable NSString *)getUserAgentWithKey:(nonnull NSString *)key;

/**
 *  获取活动相关配置信息
 *  适用于pushViewController
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @return void
 */
+ (void)configAdViewWithKey:(nonnull NSString *)key withTarget:(nonnull UIView *)view
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure;

/**
 *  获取活动相关配置信息
 *  适用于presentViewController
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @return void
 */
+ (void)configAdViewWithKey:(nonnull NSString *)key withTargetView:(nonnull UIView *)view withTargetViewController:(nonnull UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @return void
 */
+ (void)configAdViewWithKey:(nonnull NSString *)key withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @param mLinkHandler callback 当活动类型为mlink的时候，点击的该活动的时候，会调用这个回调，return mlink需要的相关参数
 *  @return void
 */
+ (void)configAdViewWithKey:(nonnull NSString *)key withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap
               mLinkHandler:(nullable CallbackWithMLinkCampaign)mLinkHandler;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @param mLinkHandler callback 当活动类型为mlink的时候，点击的该活动的时候，会调用这个回调，return mlink需要的相关参数
 *  @param mLinkLandingPageHandler callback 当活动类型为mlink landing page的时候，点击的该活动的时候，会调用这个回调，return mlink landing page需要的相关参数
 *  @return void
 */
+ (void)configAdViewWithKey:(nonnull NSString *)key withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap
               mLinkHandler:(nullable CallbackWithMLinkCampaign)mLinkHandler
    mLinkLandingPageHandler:(nullable CallbackWithMLinkLandingPage)landingPageHandler;

/**
 *  获取活动相关配置信息，支持A跳到B，B返回A，魔窗位即代表A
 *  适用于所有的UIViewController
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param callBackMLinkKey : mLink key ,当从B返回回来的时候，会根据mLink key来跳转到相应的页面
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @param mLinkHandler callback 当活动类型为mlink的时候，点击的该活动的时候，会调用这个回调，return mlink需要的相关参数
 *  @param mLinkLandingPageHandler callback 当活动类型为mlink landing page的时候，点击的该活动的时候，会调用这个回调，return mlink landing page需要的相关参数
 *  @param MLinkCallBackParamas :callback 当从B返回过来的时候，需要的相关参数
 *  @return void
 */
+ (void)configAdViewWithKey:(nonnull NSString *)key withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller WithCallBackMLinkKey:(nullable NSString *)callBackMLinkKey
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap
                      mLinkHandler:(nullable CallbackWithMLinkCampaign)mLinkHandler
                mLinkLandingPageHandler:(nullable CallbackWithMLinkLandingPage)landingPageHandler
       MLinkCallBackParamas:(nullable CallbackWithReturnMLink)mLinkCallBackParamas;

/**
 *  发送展现日志
 *  @param key 魔窗位key
 *  确定视图显示在window上之后再调用trackImpression，不要太早调用，在tableview或scrollview中使用时尤其要注意
 */
+ (void)trackImpressionWithKey:(nonnull NSString *)key;

/**
 *  判断单个魔窗位上是否有活动
 *  @param mwkey 魔窗位key
 *  @return yes:有处于活跃状态的活动；no：没有处于活跃状态的活动
 */
+(BOOL)isActiveOfmwKey:(nonnull NSString *)mwkey;

/**
 *  批量判断魔窗位上是否有活动
 *  @param mwKeys 魔窗位keys
 *  @return NSArray 有活动的魔窗位keys
 */
+(nullable NSArray *)mwkeysWithActiveCampign:(nonnull NSArray *)mwKeys;

/**
 *  自动打开webView,显示活动
 *  只有在成功获取到活动信息的时候，该方法才有效
 *  @param key 魔窗位key
 *  @param view 展示活动简介的view
 *  @return void
 */
+ (void)autoOpenWebViewWithKey:(nonnull NSString *)key withTargetView:(nonnull UIView *)view;

/**
 *  判断是否发送webview的相关通知（进入webView，关闭webView）
 *  只有在成功获取到活动信息的时候，该方法才有效
 *  @param enable YES:打开，NO:关闭。默认状态为NO
 *  @return void
 */
+ (void)setWebViewNotificationEnable:(BOOL)enable;

/**
 *  是否自定义活动详情页面的导航条按钮
 *  @param enable YES:自定义，NO:不自定义。默认状态为NO
 *  @return void
 */
+ (void)setWebViewBarEditEnable:(BOOL)enable;

#pragma mark Dynamic Campaign
/**
 *  获取动态魔窗位的相关信息
 *  @param dynamicKeys array中是MWDynamicKeyDomain（MWApiObject.h）对象
 *  @param success callback 当成功获取到动态魔窗位相关信息的时候会调用这个回调，其中会返回有效的dynamicKeys
 *  @param failure callback 当获取到动态魔窗位相关信息失败的时候会调用这个回调
 *  @return void
 */
+ (void)getAllDynamicMW:(nonnull NSArray *)dynamicKeys Success:(void (^ _Nullable)(NSArray *_Nonnull dynamicKeys))success Failure:(void (^ _Nullable)(NSString *_Nonnull errorMessage))failure;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param dynamicMWKey 动态魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @return void
 */
+ (void)configAdViewWithDynamicMWKey:(nonnull NSString *)dynamicMWKey withTargetView:(nonnull UIView *)view withTargetViewController:(nonnull UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param dynamicMWKey 动态魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @return void
 */
+ (void)configAdViewWithDynamicMWKey:(nonnull NSString *)dynamicMWKey withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param dynamicMWKey 动态魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @param mLinkHandler callback 当活动类型为mlink的时候，点击的该活动的时候，会调用这个回调，return mlink需要的相关参数
 *  @return void
 */
+ (void)configAdViewWithDynamicMWKey:(nonnull NSString *)dynamicMWKey withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap
               mLinkHandler:(nullable CallbackWithMLinkCampaign)mLinkHandler;

/**
 *  获取活动相关配置信息
 *  适用于所有的UIViewController
 *  @param dynamicMWKey 动态魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @param mLinkHandler callback 当活动类型为mlink的时候，点击的该活动的时候，会调用这个回调，return mlink需要的相关参数
 *  @param mLinkLandingPageHandler callback 当活动类型为mlink landing page的时候，点击的该活动的时候，会调用这个回调，return mlink landing page需要的相关参数
 *  @return void
 */
+ (void)configAdViewWithDynamicMWKey:(nonnull NSString *)dynamicMWKey withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap
               mLinkHandler:(nullable CallbackWithMLinkCampaign)mLinkHandler
    mLinkLandingPageHandler:(nullable CallbackWithMLinkLandingPage)landingPageHandler;

/**
 *  获取活动相关配置信息，支持A跳到B，B返回A，魔窗位即代表A
 *  适用于所有的UIViewController
 *  @param dynamicMWKey 动态魔窗位key
 *  @param view 展示活动简介的view
 *  @param controller 展示活动简介的UIViewController
 *  @param callBackMLinkKey : mLink key ,当从B返回回来的时候，会根据mLink key来跳转到相应的页面
 *  @param success callback 当成功获取到该魔窗位上活动的时候会调用这个回调
 *  @param failure callback 当获取到该魔窗位上活动失败的时候会调用这个回调
 *  @param tap callback 当点击该魔窗位上活动的时候会调用这个回调，return YES 允许跳转，NO 不允许跳转
 *  @param mLinkHandler callback 当活动类型为mlink的时候，点击的该活动的时候，会调用这个回调，return mlink需要的相关参数
 *  @param mLinkLandingPageHandler callback 当活动类型为mlink landing page的时候，点击的该活动的时候，会调用这个回调，return mlink landing page需要的相关参数
 *  @param MLinkCallBackParamas :callback 当从B返回过来的时候，需要的相关参数
 *  @return void
 */
+ (void)configAdViewWithDynamicMWKey:(nonnull NSString *)dynamicMWKey withTargetView:(nonnull UIView *)view withTargetViewController:(nullable UIViewController *)controller WithCallBackMLinkKey:(nullable NSString *)callBackMLinkKey
                    success:(CallbackWithCampaignSuccess)success
                    failure:(CallbackWithCampaignFailure)failure
                        tap:(nullable CallbackWithTapCampaign)tap
               mLinkHandler:(nullable CallbackWithMLinkCampaign)mLinkHandler
    mLinkLandingPageHandler:(nullable CallbackWithMLinkLandingPage)landingPageHandler
       MLinkCallBackParamas:(nullable CallbackWithReturnMLink)mLinkCallBackParamas;

#pragma mark Custom event

/**
 *  标识某个页面访问的开始，在合适的位置调用,name不能为空。
 *  @param name 页面的唯一标示，不能为空
 *  @return void
 */
+ (void)pageviewStartWithName:(nonnull NSString *)name;

/**
 *  标识某个页面访问的结束，与pageviewStartWithName配对使用，name不能为空。
 *  @param name 页面的唯一标示，不能为空
 *  @return void
 */
+ (void)pageviewEndWithName:(nonnull NSString *)name;

/**
 * 自定义事件
 *  @param eventId 自定义事件的唯一标示，不能为空
 *  @return void
 */
+ (void)setCustomEvent:(nonnull NSString *)eventId;

/**
 * 自定义事件
 *  @param eventId 自定义事件的唯一标示，不能为空
 *  @param attributes 动态参数，最多可包含9个
 *  @return void
 */
+ (void)setCustomEvent:(nonnull NSString *)eventId attributes:(nullable NSDictionary *)attributes;


#pragma mark Location
/**
 *  设置经纬度信息
 *  @param latitude 纬度
 *  @param longitude 经度
 *  @return void
 */
+ (void)setLatitude:(double)latitude longitude:(double)longitude;

/** 
 *  设置经纬度信息
 *  @param location CLLocation 经纬度信息
 *  @return void
 */
+ (void)setLocation:(nonnull CLLocation *)location;

/**
 *  设置城市编码，以便获取相应城市的活动数据，目前仅支持到地级市
 *  国家标准的行政区划代码:http://files2.mca.gov.cn/www/201510/20151027164514222.htm
 *  @param code 城市编码
 *  @return void
 */
+ (void)setCityCode:(nonnull NSString *)code;

#pragma mark Share

/**
 *  处理第三方app通过URL启动App时传递的数据
 *  需要在 application:handleOpenURL中调用。
 *  @param url 启动App的URL
 *  @param delegate 用来接收第三方app触发的消息。
 *  @return 成功返回YES，失败返回NO。
 */
+ (BOOL)handleOpenURL:(nonnull NSURL *)url delegate:(nullable id)delegate;

/**
 *  @deprecated This method is deprecated starting in version 3.66
 *  @note Please use @code handleOpenURL:delegate: @code instead.
 **/
+ (BOOL)handleOpenURL:(nonnull NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(nullable id)annotation delegate:(nullable id)delegate DEPRECATED(3.66);

#pragma mark mLink
/**
 * 获得最近一次的mLink短链接的渠道来源
 * @return stirng
 */
+ (nullable NSString *)getLastChannelForMLink;

/**
 * 注册一个mLink handler，当接收到URL的时候，会根据mLink key进行匹配，当匹配成功会调用相应的handler
 * 需要在 AppDelegate 的 didFinishLaunchingWithOptions 中调用
 * @param key 后台注册mlink时生成的mlink key
 * @param handler mlink的回调
 * @param params 动态参数
 * @return void
 */
+ (void)registerMLinkHandlerWithKey:(nonnull NSString *)key handler:(CallBackMLink)handler;

/**
 * 注册一个默认的mLink handler，当接收到URL，并且所有的mLink key都没有匹配成功，就会调用默认的mLink handler
 * 需要在 AppDelegate 的 didFinishLaunchingWithOptions 中调用
 * @param handler mlink的回调
 * @return void
 */
+ (void)registerMLinkDefaultHandler:(CallBackMLink)handler;

/**
 * 根据不同的URL路由到不同的app展示页
 * 需要在 application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中调用
 * @param url 传入上面方法中的openUrl
 *  @return void
 */
+ (void)routeMLink:(nonnull NSURL *)url;

/**
 *  根据universal link路由到不同的app展示页
 *  需要在 application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler 中调用
 *  @param userActivity 传入上面方法中的userActivity
 *  @return BOOL
 */
+ (BOOL)continueUserActivity:(nonnull NSUserActivity *)userActivity;

/**
 *  A跳B，B判断是否需要返回A
 *  @return BOOL YES：需要返回，NO：不需要返回
 */
+ (BOOL)callbackEnable;

/**
 *  A跳B，B返回A的时候，调用此方法
 *  @param params 返回A时需要传入的参数
 *  @return BOOL YES：成功返回，NO：失败
 */
+ (BOOL)returnOriginAppWithParams:(nullable NSDictionary *)params;

/**
 *  获取无码邀请中传回来的相关值
 *  @param paramKey，比如:u_id
 *  @return id 返回相应的值
 */
+ (nullable id)getMLinkParam:(nonnull NSString *)paramKey;

@end
