42 lines
1.2 KiB
Swift
42 lines
1.2 KiB
Swift
import Foundation
|
|
|
|
enum AllocationTargetStore {
|
|
private static let targetsKey = "allocationTargets"
|
|
|
|
static func target(for categoryId: UUID) -> Double? {
|
|
loadTargets()[categoryId.uuidString]
|
|
}
|
|
|
|
static func setTarget(_ value: Double?, for categoryId: UUID) {
|
|
var targets = loadTargets()
|
|
let key = categoryId.uuidString
|
|
if let value, value > 0 {
|
|
targets[key] = value
|
|
} else {
|
|
targets.removeValue(forKey: key)
|
|
}
|
|
saveTargets(targets)
|
|
}
|
|
|
|
static func totalTargetPercentage(for categoryIds: [UUID]) -> Double {
|
|
let targets = loadTargets()
|
|
return categoryIds.reduce(0) { total, id in
|
|
total + (targets[id.uuidString] ?? 0)
|
|
}
|
|
}
|
|
|
|
private static func loadTargets() -> [String: Double] {
|
|
guard let data = UserDefaults.standard.data(forKey: targetsKey),
|
|
let decoded = try? JSONDecoder().decode([String: Double].self, from: data) else {
|
|
return [:]
|
|
}
|
|
return decoded
|
|
}
|
|
|
|
private static func saveTargets(_ targets: [String: Double]) {
|
|
if let data = try? JSONEncoder().encode(targets) {
|
|
UserDefaults.standard.set(data, forKey: targetsKey)
|
|
}
|
|
}
|
|
}
|