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