1// Copyright 2015-present 650 Industries. All rights reserved.
2
3#import "EXKernelServiceRegistry.h"
4#import "EXBranchManager.h"
5#import "EXErrorRecoveryManager.h"
6#import "EXGoogleAuthManager.h"
7#import "EXKernelLinkingManager.h"
8#import "EXKernelModuleManager.h"
9#import "EXKernelService.h"
10#import "EXRemoteNotificationManager.h"
11#import "EXScreenOrientationManager.h"
12#import "EXSensorManager.h"
13
14@interface EXKernelServiceRegistry ()
15
16@property (nonatomic, strong) EXBranchManager *branchManager;
17@property (nonatomic, strong) EXGoogleAuthManager *googleAuthManager;
18@property (nonatomic, strong) EXErrorRecoveryManager *errorRecoveryManager;
19@property (nonatomic, strong) EXKernelModuleManager *kernelModuleManager;
20@property (nonatomic, strong) EXKernelLinkingManager *linkingManager;
21@property (nonatomic, strong) EXRemoteNotificationManager *remoteNotificationManager;
22@property (nonatomic, strong) EXScreenOrientationManager *screenOrientationManager;
23@property (nonatomic, strong) EXSensorManager *sensorManager;
24@property (nonatomic, strong) NSDictionary<NSString *, id> *allServices;
25
26@end
27
28@implementation EXKernelServiceRegistry
29
30- (instancetype)init
31{
32  if (self = [super init]) {
33    // TODO: init these in some clean way
34    [self branchManager];
35    [self errorRecoveryManager];
36    [self remoteNotificationManager];
37    [self linkingManager];
38    [self kernelModuleManager];
39    [self screenOrientationManager];
40    [self googleAuthManager];
41    [self sensorManager];
42  }
43  return self;
44}
45
46- (EXBranchManager *)branchManager
47{
48  if (!_branchManager) {
49    _branchManager = [[EXBranchManager alloc] init];
50  }
51  return _branchManager;
52}
53
54- (EXRemoteNotificationManager *)remoteNotificationManager
55{
56  if (!_remoteNotificationManager) {
57    _remoteNotificationManager = [[EXRemoteNotificationManager alloc] init];
58  }
59  return _remoteNotificationManager;
60}
61
62- (EXErrorRecoveryManager *)errorRecoveryManager
63{
64  if (!_errorRecoveryManager) {
65    _errorRecoveryManager = [[EXErrorRecoveryManager alloc] init];
66  }
67  return _errorRecoveryManager;
68}
69
70- (EXGoogleAuthManager *)googleAuthManager
71{
72  if (!_googleAuthManager) {
73    _googleAuthManager = [[EXGoogleAuthManager alloc] init];
74  }
75  return _googleAuthManager;
76}
77
78- (EXKernelLinkingManager *)linkingManager
79{
80  if (!_linkingManager) {
81    _linkingManager = [[EXKernelLinkingManager alloc] init];
82  }
83  return _linkingManager;
84}
85
86- (EXKernelModuleManager *)kernelModuleManager
87{
88  if (!_kernelModuleManager) {
89    _kernelModuleManager = [[EXKernelModuleManager alloc] init];
90  }
91  return _kernelModuleManager;
92}
93
94- (EXScreenOrientationManager *)screenOrientationManager
95{
96  if (!_screenOrientationManager) {
97    _screenOrientationManager = [[EXScreenOrientationManager alloc] init];
98  }
99  return _screenOrientationManager;
100}
101
102- (EXSensorManager *)sensorManager
103{
104  if (!_sensorManager) {
105    _sensorManager = [[EXSensorManager alloc] init];
106  }
107  return _sensorManager;
108}
109
110- (NSDictionary *)allServices
111{
112  if (!_allServices) {
113    NSMutableDictionary *result = [NSMutableDictionary dictionary];
114    for (id service in @[ self.branchManager, self.errorRecoveryManager, self.googleAuthManager, self.kernelModuleManager, self.linkingManager, self.remoteNotificationManager, self.screenOrientationManager, self.sensorManager ]) {
115      NSString *className = NSStringFromClass([service class]);
116      result[className] = service;
117    }
118    _allServices = result;
119  }
120  return _allServices;
121}
122
123#pragma mark - bridge registry delegate
124
125- (void)bridgeRegistry:(EXKernelBridgeRegistry *)registry didRegisterBridgeRecord:(EXKernelBridgeRecord *)bridgeRecord
126{
127  [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id  _Nonnull service, BOOL * _Nonnull stop) {
128    if ([service respondsToSelector:@selector(kernelDidRegisterBridgeWithRecord:)]) {
129      [service kernelDidRegisterBridgeWithRecord:bridgeRecord];
130    }
131  }];
132}
133
134- (void)bridgeRegistry:(EXKernelBridgeRegistry *)registry willUnregisterBridgeRecord:(EXKernelBridgeRecord *)bridgeRecord
135{
136  [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id  _Nonnull service, BOOL * _Nonnull stop) {
137    if ([service respondsToSelector:@selector(kernelWillUnregisterBridgeWithRecord:)]) {
138      [service kernelWillUnregisterBridgeWithRecord:bridgeRecord];
139    }
140  }];
141}
142
143@end
144