You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
4.7 KiB
104 lines
4.7 KiB
//
|
|
// MonthData.swift
|
|
// PadelClub
|
|
//
|
|
// Created by Razmig Sarkissian on 18/04/2024.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
import LeStorage
|
|
|
|
@Observable
|
|
final class MonthData : ModelObject, Storable {
|
|
|
|
static func resourceName() -> String { return "month-data" }
|
|
static func tokenExemptedMethods() -> [HTTPMethod] { return [] }
|
|
static func filterByStoreIdentifier() -> Bool { return false }
|
|
static var relationshipNames: [String] = []
|
|
|
|
private(set) var id: String = Store.randomId()
|
|
private(set) var monthKey: String
|
|
private(set) var creationDate: Date
|
|
var maleUnrankedValue: Int? = nil
|
|
var femaleUnrankedValue: Int? = nil
|
|
var maleCount: Int? = nil
|
|
var femaleCount: Int? = nil
|
|
var anonymousCount: Int? = nil
|
|
var incompleteMode: Bool = false
|
|
var dataModelIdentifier: String?
|
|
var fileModelIdentifier: String?
|
|
|
|
init(monthKey: String) {
|
|
self.monthKey = monthKey
|
|
self.creationDate = Date()
|
|
}
|
|
|
|
required init(from decoder: Decoder) throws {
|
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
id = try container.decode(String.self, forKey: ._id)
|
|
monthKey = try container.decode(String.self, forKey: ._monthKey)
|
|
creationDate = try container.decode(Date.self, forKey: ._creationDate)
|
|
maleUnrankedValue = try container.decodeIfPresent(Int.self, forKey: ._maleUnrankedValue)
|
|
femaleUnrankedValue = try container.decodeIfPresent(Int.self, forKey: ._femaleUnrankedValue)
|
|
maleCount = try container.decodeIfPresent(Int.self, forKey: ._maleCount)
|
|
femaleCount = try container.decodeIfPresent(Int.self, forKey: ._femaleCount)
|
|
anonymousCount = try container.decodeIfPresent(Int.self, forKey: ._anonymousCount)
|
|
incompleteMode = try container.decodeIfPresent(Bool.self, forKey: ._incompleteMode) ?? false
|
|
dataModelIdentifier = try container.decodeIfPresent(String.self, forKey: ._dataModelIdentifier) ?? nil
|
|
fileModelIdentifier = try container.decodeIfPresent(String.self, forKey: ._fileModelIdentifier) ?? nil
|
|
|
|
}
|
|
|
|
func total() -> Int {
|
|
return (maleCount ?? 0) + (femaleCount ?? 0)
|
|
}
|
|
|
|
static func calculateCurrentUnrankedValues(fromDate: Date) async {
|
|
|
|
let fileURL = SourceFileManager.shared.allFiles(true).first(where: { $0.dateFromPath == fromDate && $0.index == 0 })
|
|
print("calculateCurrentUnrankedValues", fromDate.monthYearFormatted, fileURL?.path())
|
|
let fftImportingUncomplete = fileURL?.fftImportingUncomplete()
|
|
let fftImportingMaleUnrankValue = fileURL?.fftImportingMaleUnrankValue()
|
|
|
|
let incompleteMode = fftImportingUncomplete != nil
|
|
|
|
let lastDataSourceMaleUnranked = await FederalPlayer.lastRank(mostRecentDateAvailable: fromDate, man: true)
|
|
let lastDataSourceFemaleUnranked = await FederalPlayer.lastRank(mostRecentDateAvailable: fromDate, man: false)
|
|
let anonymousCount = await FederalPlayer.anonymousCount(mostRecentDateAvailable: fromDate)
|
|
await MainActor.run {
|
|
let lastDataSource = URL.importDateFormatter.string(from: fromDate)
|
|
let currentMonthData : MonthData = DataStore.shared.monthData.first(where: { $0.monthKey == lastDataSource }) ?? MonthData(monthKey: lastDataSource)
|
|
currentMonthData.dataModelIdentifier = PersistenceController.getModelVersion()
|
|
currentMonthData.fileModelIdentifier = fileURL?.fileModelIdentifier()
|
|
currentMonthData.maleUnrankedValue = incompleteMode ? fftImportingMaleUnrankValue : lastDataSourceMaleUnranked?.0
|
|
currentMonthData.incompleteMode = incompleteMode
|
|
currentMonthData.maleCount = incompleteMode ? fftImportingUncomplete : lastDataSourceMaleUnranked?.1
|
|
currentMonthData.femaleUnrankedValue = lastDataSourceFemaleUnranked?.0
|
|
currentMonthData.femaleCount = lastDataSourceFemaleUnranked?.1
|
|
currentMonthData.anonymousCount = anonymousCount
|
|
do {
|
|
try DataStore.shared.monthData.addOrUpdate(instance: currentMonthData)
|
|
} catch {
|
|
Logger.error(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
override func deleteDependencies() throws {
|
|
}
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case _id = "id"
|
|
case _monthKey = "monthKey"
|
|
case _creationDate = "creationDate"
|
|
case _maleUnrankedValue = "maleUnrankedValue"
|
|
case _femaleUnrankedValue = "femaleUnrankedValue"
|
|
case _maleCount = "maleCount"
|
|
case _femaleCount = "femaleCount"
|
|
case _anonymousCount = "anonymousCount"
|
|
case _incompleteMode = "incompleteMode"
|
|
case _dataModelIdentifier = "dataModelIdentifier"
|
|
case _fileModelIdentifier = "fileModelIdentifier"
|
|
}
|
|
}
|
|
|