// // 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" } }