// // ServersModuleBuilder.swift // Privado // // Created by Jura on 10/10/19. // Copyright © 2019 Omicronmedia. All rights reserved. // import Foundation import UIKit typealias ServersModuleCompoundOutput = ServersModuleOutput & UpgradeModuleOutput & TrafficCounterModuleOutput & UpgradeWarningModuleOutput & PreferenceModuleOutputIPAD & NotificationsModuleOutput & AppTutorialModuleOutput protocol ServersModuleOutput: AnyObject { func navigate(to route: Route) } final class ServersModuleBuilder { static func build(output: ServersModuleCompoundOutput) -> (UIViewController, ServersPresenterInput) { let presenter = ServersPresenter(output: output) let controller: (UIViewController & ServersControllerInput) = DeviceInfoProvider.isIPad ? ServersControllerIPAD(output: presenter, componentCreation: self.createComponentIPAD(with: presenter, and: output), modalCreation: self.createModalIPAD(output: output)) : ServersController(output: presenter, componentCreation: self.createComponent(with: presenter, and: output), modalCreation: self.createModal(output: output)) presenter.viewInput = controller let settingsBuilder = PreferenceModuleBuilderIPAD.build(output: output) presenter.settingsInput = settingsBuilder.presenter if let controller = controller as? ServersControllerIPAD { controller.preferenceViewController = settingsBuilder.view } return (controller, presenter) } private static func createModalIPAD(output: ServersModuleCompoundOutput) -> ServersControllerIPAD.ModalCreationClosure { return { (component: ServersControllerModalComponentIPAD) -> (UIViewController) in switch component { case .notifications: return NotificationsModuleBuilder.build(output: output) case .upgrade: return UpgradeModuleBuilder.build(output: output) } } } private static func createModal(output: ServersModuleCompoundOutput) -> ServersController.ModalCreationClosure { return { (component: ServersControllerModalComponent) -> (UIViewController) in switch component { case .upgrade: return UpgradeModuleBuilder.build(output: output) case .tutorial: return AppTutorialModuleBuilder.build(output: output) } } } private static func createComponent(with presenter: ServersPresenter, and output: ServersModuleCompoundOutput) -> ServersController.ComponentCreationClosure { return { (component: ServersControllerComponent) -> UIView in switch component { case .serverList: return ServerListModuleBuilder.build(output: presenter) case .connection: return ConnectionModuleBuilder.build(output: presenter) case .location: return LocationModuleBuilder.build(output: presenter) case .menu: return MenuServerModuleBuilder.build(output: output) case .message: return MessageModuleBuilder.build(output: presenter) case .notifications: return NotificationsBellModuleBuilder.build(output: output) case .traffic: return TrafficCounterModuleBuilder.build(output: output) case .upgradeWarning: return UpgradeWarningModuleBuilder.build(output: output) } } } private static func createComponentIPAD(with presenter: ServersPresenter, and output: ServersModuleCompoundOutput) -> ServersControllerIPAD.ComponentCreationClosure { return { (component: ServersControllerComponentIPAD) -> UIView in switch component { case .serverList: return ServerListModuleBuilder.build(output: presenter) case .connection: return ConnectionModuleBuilder.build(output: presenter) case .connectionStatus: return ConnectionStatusModuleBuilder.build() case .menu: return MenuServerModuleBuilder.build(output: output) case .notificationsBell: return NotificationsBellModuleBuilder.build(output: output) case .trafficCounter: return TrafficCounterModuleBuilder.build(output: output) case .location: return LocationModuleBuilder.build(output: presenter) case .message: return MessageModuleBuilder.build(output: presenter) } } } }