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.
103 lines
3.1 KiB
103 lines
3.1 KiB
//
|
|
// DrawLog.swift
|
|
// PadelClub
|
|
//
|
|
// Created by razmig on 22/10/2024.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
import LeStorage
|
|
|
|
@Observable
|
|
final class DrawLog: ModelObject, Storable {
|
|
static func resourceName() -> String { return "draw-logs" }
|
|
static func tokenExemptedMethods() -> [HTTPMethod] { return [] }
|
|
static func filterByStoreIdentifier() -> Bool { return false }
|
|
static var relationshipNames: [String] = []
|
|
|
|
var id: String = Store.randomId()
|
|
var tournament: String
|
|
var drawDate: Date = Date()
|
|
var drawSeed: Int
|
|
var drawMatchIndex: Int
|
|
var drawTeamPosition: TeamPosition
|
|
|
|
internal init(id: String = Store.randomId(), tournament: String, drawDate: Date = Date(), drawSeed: Int, drawMatchIndex: Int, drawTeamPosition: TeamPosition) {
|
|
self.id = id
|
|
self.tournament = tournament
|
|
self.drawDate = drawDate
|
|
self.drawSeed = drawSeed
|
|
self.drawMatchIndex = drawMatchIndex
|
|
self.drawTeamPosition = drawTeamPosition
|
|
}
|
|
|
|
func tournamentObject() -> Tournament? {
|
|
Store.main.findById(self.tournament)
|
|
}
|
|
|
|
func computedBracketPosition() -> Int {
|
|
drawMatchIndex * 2 + drawTeamPosition.rawValue
|
|
}
|
|
|
|
func updateTeamBracketPosition(_ team: TeamRegistration) {
|
|
guard let match = drawMatch() else { return }
|
|
let seedPosition: Int = match.lockAndGetSeedPosition(atTeamPosition: drawTeamPosition)
|
|
team.bracketPosition = seedPosition
|
|
tournamentObject()?.updateTeamScores(in: seedPosition)
|
|
}
|
|
|
|
func exportedDrawLog() -> String {
|
|
[drawDate.localizedDate(), localizedDrawLogLabel(), localizedDrawBranch()].joined(separator: " ")
|
|
}
|
|
|
|
func localizedDrawSeedLabel() -> String {
|
|
return "Tête de série #\(drawSeed + 1)"
|
|
}
|
|
|
|
func localizedDrawLogLabel() -> String {
|
|
return [localizedDrawSeedLabel(), positionLabel()].joined(separator: " -> ")
|
|
}
|
|
|
|
func localizedDrawBranch() -> String {
|
|
drawTeamPosition.localizedBranchLabel()
|
|
}
|
|
|
|
func drawMatch() -> Match? {
|
|
let roundIndex = RoundRule.roundIndex(fromMatchIndex: drawMatchIndex)
|
|
return tournamentStore.rounds.first(where: { $0.parent == nil && $0.index == roundIndex })?._matches().first(where: { $0.index == drawMatchIndex })
|
|
}
|
|
|
|
func positionLabel() -> String {
|
|
return drawMatch()?.roundAndMatchTitle() ?? ""
|
|
}
|
|
|
|
func roundLabel() -> String {
|
|
return drawMatch()?.roundTitle() ?? ""
|
|
}
|
|
|
|
func matchLabel() -> String {
|
|
return drawMatch()?.matchTitle() ?? ""
|
|
}
|
|
|
|
var tournamentStore: TournamentStore {
|
|
return TournamentStore.instance(tournamentId: self.tournament)
|
|
}
|
|
|
|
override func deleteDependencies() throws {
|
|
}
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case _id = "id"
|
|
case _tournament = "tournament"
|
|
case _drawDate = "drawDate"
|
|
case _drawSeed = "drawSeed"
|
|
case _drawMatchIndex = "drawMatchIndex"
|
|
case _drawTeamPosition = "drawTeamPosition"
|
|
}
|
|
|
|
func insertOnServer() throws {
|
|
self.tournamentStore.drawLogs.writeChangeAndInsertOnServer(instance: self)
|
|
}
|
|
|
|
}
|
|
|