// // CardsService.swift // Wallet // // Created by Igor on 16.12.2020. // Copyright © 2020 AM. All rights reserved. // import Foundation import Alamofire extension Cards { class Service { private(set) var collection = [Cards.Model]() var `default`: Cards.Model? { get { collection.first } set { guard let newValue = newValue else { return } if let index = collection.lastIndex(where: { $0.uuid == newValue.uuid }) { collection.remove(at: index) } collection.insert(newValue, at: 0) save() } } init() { if let data = UserDefaults.standard.value(forKey: "Cards_Service_cards_new") as? Data, let objects = try? JSONDecoder().decode([Cards.Model].self, from: data) { collection = objects } cardsMigration() } func save(card: Cards.Model) { if let index = collection.lastIndex(where: { $0.uuid == card.uuid }) { collection.remove(at: index) collection.insert(card, at: index) } else { collection.append(card) } save() } func delete(card: Cards.Model) { collection.removeAll(where: { $0.uuid == card.uuid }) save() } private func save() { guard let data = try? JSONEncoder().encode(collection) else { return } UserDefaults.standard.setValue(data, forKey: "Cards_Service_cards_new") UserDefaults.standard.synchronize() } enum Menu: String { case edit case primary case delete var title: String { "cards.menu.\(rawValue)".localized } } func menu(for card: Cards.Model) -> [Menu] { `default`?.uuid == card.uuid ? [.edit, .delete] : [.edit, .primary, .delete] } private func cardsMigration() { if let data = UserDefaults.standard.value(forKey: "Cards_Service_cards") as? Data, let objects = try? JSONDecoder().decode([Cards.OldModel].self, from: data), !objects.isEmpty { let environment = ApplicationEnvironment.shared().current AF.request( environment.backend.urlPath, method: .post, parameters: P2PCardsGraphQLRequest(variables: P2PCardsGraphQLRequest.Variables(iins: Array(Set(objects.map({ Cards.Model.cleaned(number: $0.number) }))))), encoder: JSONParameterEncoder.default, headers: HTTPHeaders(environment.headers) ).responseDecodable(of: GraphQLResponse.self) { response in switch response.result { case let .success(value): if let error = value.errorsDescription { print(error) } else { for card in value.data?.checkBankCards?.cards ?? [] { if let cardOld = objects.first(where: { Cards.Model.cleaned(number: $0.number) == Cards.Model.cleaned(number: card.cardNumber) }), !self.collection.contains(where: { Cards.Model.cleaned(number: $0.number) == Cards.Model.cleaned(number: cardOld.number) }) { let type = Cards.Model.Kind(rawValue: card.brand ?? "") ?? .UNKNOWN self.collection.append(Cards.Model(uuid: cardOld.uuid, number: cardOld.number, countryId: card.countryId, country: card.country, bankId: card.bankId, bank: card.bank.name, type: type)) } } self.save() if value.data?.checkBankCards?.cards.count == Set(objects.map({ Cards.Model.cleaned(number: $0.number) })).count { UserDefaults.standard.removeObject(forKey: "Cards_Service_cards") } } case let .failure(error): print(error) } } } } } } extension Cards.Service.Menu: CommonMenuMappable { func toMenu() -> Common.Model.Menu { .menu(uuid: rawValue, title: title)} }