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