Files
eqn.ios/Sources/Earthquake Network/Controllers/Seismic Networks/SeismicNetworkViewModel.swift
T

92 lines
3.4 KiB
Swift

//
// SeismicNetworkViewModel.swift
// Earthquake Network
//
// Created by Andrea Busi on 15/03/21.
// Copyright © 2021 Earthquake Network. All rights reserved.
//
import Foundation
struct SeismicNetworkViewModel {
var place: String
var network: String
var isPreliminary: Bool
var magnitude: String
var depth: String
var time: String
var distance: String
var coordinate: String
var population: String
var smartphones: String
var users: String
// MARK: - Init
init(seismic: EQNSisma) {
self.place = seismic.place
self.network = seismic.provider
let isPreliminary = seismic.preliminary.intValue > 0
self.isPreliminary = isPreliminary
if isPreliminary {
let lowerValue = seismic.magnitude.doubleValue - seismic.magnitudeRange.doubleValue/2.0
let upperValue = seismic.magnitude.doubleValue + seismic.magnitudeRange.doubleValue/2.0
self.magnitude = String(format: "%.1f-%.1f\(seismic.magnitudeType)", lowerValue, upperValue)
self.depth = ""
} else {
self.magnitude = String(format: "%.1f%@", seismic.magnitude.doubleValue, seismic.magnitudeType)
self.depth = String(format: "%@: %.1f km", NSLocalizedString("Profondità", comment: ""), seismic.depth.doubleValue)
}
// we need to check agains null values, because sometimes WS returns invalid dates
if let date = seismic.date {
let formattedDate = EQNUtility.formattedDate(from: date)
let time = EQNUtility.formattedString(forTimeDifference: Int(seismic.timeDifference))
self.time = "\(formattedDate) - \(time)"
} else {
self.time = "no time available"
}
// distance
let distanceRounded = Int(round(seismic.userDistance))
self.distance = "\(distanceRounded) km \(NSLocalizedString("dalla tua posizione", comment: ""))"
let coordinateText = EQNUtility.coordinateString(coordinate: seismic.coordinate.coordinate)
self.coordinate = "\(coordinateText)"
let population = Self.formatPopulation(seismic.population100km)
self.population = "\(population) \(NSLocalizedString("share_radius100", comment: ""))"
if seismic.smartphoneNumber.intValue > 0 {
self.smartphones = String(format: NSLocalizedString("official_smartphones", comment: ""), seismic.smartphoneNumber)
} else {
self.smartphones = ""
}
if seismic.userNumber.intValue > 0 {
self.users = String(format: NSLocalizedString("official_reports", comment: ""), seismic.userNumber)
} else {
self.users = ""
}
}
// MARK: - Private
/// Format population value (ex. 1.5M, 2.4k)
private static func formatPopulation(_ population: Double) -> String {
var populationString = ""
if population > 999_999 {
let roundedPopulation = round(population / 100_000) / 10
populationString = "\(roundedPopulation)M"
} else if population > 999 {
let roundedPopulation = round(population / 100) / 10
populationString = "\(roundedPopulation)K"
} else {
let roundedPopulation = round(population)
populationString = "\(roundedPopulation)"
}
return populationString
}
}