//
//  GMediator.h
//  GMediator
//
//  Created by Thierry on 16/3/13.
//  Copyright © 2016年 Thierry. All rights reserved.
//

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/**
 组件间解耦器
 @author Thierry 16-07-27 in 1.0
 */
@interface GMediator : NSObject

/**
 @brief 协议名
 @author Thierry 16-07-27 in 1.0
 */
@property (nonatomic, retain) NSString *scheme;

/**
 @brief 协议跳转路由表，里面注册所有更美协议Host对应的方法
 @author Thierry 16-07-27 in 1.0
 */
@property (nonatomic, retain) NSDictionary *routingDic;


+ (instancetype)sharedInstance;

/**
 通过协议URL执行到对应的类和方法
 @author Thierry 16-07-27 in 1.0
 @param url 完整的更美协议URL
 @param completion 更美协议处理成功调用该回调。其中参数字典为 ["result": AnyObject]. AnyObject 则是更美协议所对应的结果
 @return YES 表示更美协议处理成功；NO 表示更美协议处理失败
 */
- (BOOL)performActionWithUrl:(NSString *)url completion:(void (^ __nullable)(NSDictionary * _Nonnull))completion NS_SWIFT_NAME(performAction(withURL:completion:));

/**
 本地组件调用入口。使用情景最多的就是返回一个controller，所以增加了该方法，其实现就是调用 performOnTarget:action:params
 @note 作为swift调用时，该方法的返回值应该设计为可选的，但是这里并没有使用。因为有 handleNotRespond 来应对异常情况；另外也是向swift的代码特性做了妥协，要不然在业务层每次都要判断该方法返回值是否为 nil
 @author Thierry 16-07-27 in 1.0
 @param targetName 目标类名
 @param actionName 方法名
 @param params     参数
 @return 待显示的controller
 */
- (UIViewController *)controllerFromTarget:(NSString *)targetName action:(NSString *)actionName params:(nullable NSDictionary *)params NS_SWIFT_NAME(controller(fromTarget:action:params:));

/**
 本地组件调用入口
 @author Thierry 16-07-27 in 1.0
 @param targetName 目标类名
 @param actionName 方法名
 @param params     参数
 @return 待返回的值
 */
- (nullable id)performOnTarget:(NSString *)targetName action:(NSString *)actionName params:(nullable NSDictionary<NSString *, id> *)params NS_SWIFT_NAME(perform(onTarget:action:params:));

@end
NS_ASSUME_NONNULL_END