// // ResourcesModelPerformance.swift // Wallet // // Created by Igor on 09.03.2021. // Copyright © 2021 AM. All rights reserved. // import Foundation extension Resources.Model { struct Performance { enum Kind: String { case cpu case net case ram } let kind: Kind let available: Int let max: Int let staked: String let stakedByMe: String let stakedByOthers: String let divider: Decimal init( kind: Kind, available: Int? = nil, max: Int? = nil, staked: String? = nil, stakedByMe: String? = nil ) { self.kind = kind self.available = available ?? 0 self.max = max ?? 0 self.staked = staked ?? Decimal(0).toString(max: .eosioToken) self.stakedByMe = stakedByMe ?? Decimal(0).toString(max: .eosioToken) let subtract = (staked?.amount.toDecimal() ?? 0) - self.stakedByMe.amount.toDecimal() self.stakedByOthers = ((subtract > 0) ? subtract : 0).toString(max: .eosioToken) self.divider = kind == .cpu ? 1000 : 1024 } } } extension Resources.Model.Performance { private var availableDividedAndRounded: Double { let available = (Decimal(available) / divider).roundDown(to: 2) return available.doubleValue } private var maxDividedAndRounded: Double { let max = (Decimal(max) / divider).roundDown(to: 2) return max.doubleValue } private var usedDividedAndRounded: Double { return self.maxDividedAndRounded - self.availableDividedAndRounded } var availableStr: String { L10n.Resources.Performance.used2( self.availableDividedAndRounded.toString(max: 2, min: 2, group: false), kind.unit ) } var availableKbString: String { L10n.Resources.Performance.Available.kb( self.availableDividedAndRounded.toString(max: 2, min: 2, group: false, symbol: kind.unit) ) } var maxStr: String { L10n.Resources.Performance.used2( self.maxDividedAndRounded.toString(max: 2, min: 2, group: false), kind.unit ) } var availableTitle: String { L10n.Resources.Performance.available( self.availableDividedAndRounded.toString(max: 2, min: 2, group: false, symbol: kind.unit), self.maxDividedAndRounded.toString(max: 2, min: 2, group: false, symbol: kind.unit), self.availableProgress.withPercentage ) } var usedTitle: String { L10n.Resources.Performance.used( self.usedDividedAndRounded.toString(max: 2, min: 2, group: false), self.maxDividedAndRounded.toString(max: 2, min: 2, group: false), kind.unit ) } var availableProgress: Double { let safeMax = self.maxDividedAndRounded == 0 ? 1 : self.maxDividedAndRounded return self.availableDividedAndRounded / safeMax } var usedProgress: Double { let safeMax = self.maxDividedAndRounded == 0 ? 1 : self.maxDividedAndRounded return self.usedDividedAndRounded / safeMax } var usedPercentageProgress: String { self.usedProgress.withPercentage } } extension Resources.Model.Performance.Kind { var unit: String { self == .cpu ? L10n.Resources.Performance.Unit.ms : L10n.Resources.Performance.Unit.kb } var prefix: String { "resources.performance.kind.\(rawValue).prefix".localized } var name: String { "resources.performance.kind.\(rawValue).name".localized } var title: String { prefix.isEmpty ? name : "\(prefix) (\(name))" } }