// // TotalManageAccountsInteractor.swift // GME Remit // // Created by InKwon James Kim on 2019/11/15. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import Foundation class TotalManageAccountsInteractor { // MARK: Properties weak var output: TotalManageAccountsInteractorOutput? private let service: TotalManageAccountsServiceType private var accounts: [TotalAccount]? private var kftcModel: KFTCModel? // MARK: Initialization init(service: TotalManageAccountsServiceType) { self.service = service } } // MARK: TotalManageAccounts interactor input interface extension TotalManageAccountsInteractor: TotalManageAccountsInteractorInput { func fetchAccounts(_ type: AccountType) { guard let accounts = self.accounts else { callAPI() return } switch type { case .all: output?.setAccounts(accounts, kftcModel: kftcModel) case .primary: output?.setAccounts( accounts.filter {$0.accountType.filter {element in element == "primary"}.count != 0}, kftcModel: kftcModel ) case .autodebit: output?.setAccounts( accounts.filter {$0.accountType.filter {element in element == "autodebit"}.count != 0}, kftcModel: kftcModel ) case .inbound: output?.setAccounts( accounts.filter {$0.accountType.filter {element in element == "inbound"}.count != 0}, kftcModel: kftcModel ) case .none: output?.setAccounts( accounts.filter {$0.accountType.count == 0}, kftcModel: kftcModel ) } } private func callAPI() { let userId = GMEDB.shared.user.string(.userId) ?? "" service.fetchAutodebitAccounts( username: userId, success: {[weak self] kftcModel in var accounts = kftcModel?.model?.map { TotalAccount( autodebitID: $0.kftcAccountId, accountNo: $0.accountNumMasked, bankName: $0.bankName, bankCode: $0.bankCode, isPrimary: nil, isPennyTestRequested: $0.isInboundPennyTestRequested, isPennyTestSuccess: nil ) } self?.service.fetchInboundAccounts( success: {[weak self] models in let inboundAccounts = models.map { TotalAccount( autodebitID: nil, accountNo: $0.accountNo, bankName: $0.bankName, bankCode: $0.bankCode, isPrimary: $0.isPrimary, isPennyTestRequested: nil, isPennyTestSuccess: $0.isPennyTestSuccess ) } var dic = accounts?.toDictionary { "\($0.bankCode ?? "")/\($0.accountNo ?? "")" } inboundAccounts.forEach { if var element = dic?["\($0.bankCode ?? "")/\($0.accountNo ?? "")"] { element.isPennyTestSuccess = $0.isPennyTestSuccess element.isPrimary = $0.isPrimary dic?["\($0.bankCode ?? "")/\($0.accountNo ?? "")"] = element } else { dic?["\($0.bankCode ?? "")/\($0.accountNo ?? "")"] = $0 } } accounts = dic?.map { $0.value }.sorted { $0.accountType.count > $1.accountType.count } if let primaryElement = accounts?.enumerated().first(where: { $0.element.isPrimary ?? false }) { accounts?.remove(at: primaryElement.offset) accounts?.insert(primaryElement.element, at: 0) } self?.accounts = accounts self?.kftcModel = kftcModel self?.output?.setAccounts(self?.accounts ?? [], kftcModel: kftcModel) }, failure: {[weak self] in self?.output?.setError(with: $0) } ) }, failure: {[weak self] in self?.output?.setError(with: $0) } ) } func refreshToken(language: KftcLanguage?) { guard let email = GMEDB.shared.user.string(.email), let language = language else { return } let service2 = AddAccountService() service.refreshTokenStep1( username: email, success: { response in let url = response?.url?.replacingOccurrences( of: "&lang=", with: "&lang=\(language.key ?? "eng")" ) ?? "" var header = [String: String]() response?.header?.forEach({ header[$0.key ?? ""] = $0.value ?? "" }) service2.fetchKftcUrlService( url: url, header: header, success: { self.output?.refreshTokenSuccess(header: response?.header, url: $0) }, failure: { if $0.localizedDescription.contains("JSON") { self.output?.refreshTokenSuccess(header: response?.header, url: url) } else { self.output?.setError(with: $0) } } ) }, failure: { self.output?.setError(with: $0) } ) } } fileprivate extension Array { func toDictionary(with selectKey: (Element) -> Key) -> [Key:Element] { var dict = [Key: Element]() for element in self { dict[selectKey(element)] = element } return dict } }