// Generated by SwiftModelGenerator
// Do not modify this file manually

import Foundation
import LeStorage
import SwiftUI

@Observable
class BaseClub: SyncedModelObject, SyncedStorable {

    static func resourceName() -> String { return "clubs" }
    static func tokenExemptedMethods() -> [HTTPMethod] { return [] }

    var id: String = Store.randomId()
    var creator: String? = nil
    var name: String = ""
    var acronym: String = ""
    var phone: String? = nil
    var code: String? = nil
    var address: String? = nil
    var city: String? = nil
    var zipCode: String? = nil
    var latitude: Double? = nil
    var longitude: Double? = nil
    var courtCount: Int = 2
    var broadcastCode: String? = nil
    var timezone: String? = TimeZone.current.identifier

    init(
        id: String = Store.randomId(),
        creator: String? = nil,
        name: String = "",
        acronym: String = "",
        phone: String? = nil,
        code: String? = nil,
        address: String? = nil,
        city: String? = nil,
        zipCode: String? = nil,
        latitude: Double? = nil,
        longitude: Double? = nil,
        courtCount: Int = 2,
        broadcastCode: String? = nil,
        timezone: String? = TimeZone.current.identifier
    ) {
        super.init()
        self.id = id
        self.creator = creator
        self.name = name
        self.acronym = acronym
        self.phone = phone
        self.code = code
        self.address = address
        self.city = city
        self.zipCode = zipCode
        self.latitude = latitude
        self.longitude = longitude
        self.courtCount = courtCount
        self.broadcastCode = broadcastCode
        self.timezone = timezone
    }
    required public override init() {
        super.init()
    }

    enum CodingKeys: String, CodingKey {
        case _id = "id"
        case _creator = "creator"
        case _name = "name"
        case _acronym = "acronym"
        case _phone = "phone"
        case _code = "code"
        case _address = "address"
        case _city = "city"
        case _zipCode = "zipCode"
        case _latitude = "latitude"
        case _longitude = "longitude"
        case _courtCount = "courtCount"
        case _broadcastCode = "broadcastCode"
        case _timezone = "timezone"
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.id = try container.decodeIfPresent(String.self, forKey: ._id) ?? Store.randomId()
        self.creator = try container.decodeIfPresent(String.self, forKey: ._creator) ?? nil
        self.name = try container.decodeIfPresent(String.self, forKey: ._name) ?? ""
        self.acronym = try container.decodeIfPresent(String.self, forKey: ._acronym) ?? ""
        self.phone = try container.decodeIfPresent(String.self, forKey: ._phone) ?? nil
        self.code = try container.decodeIfPresent(String.self, forKey: ._code) ?? nil
        self.address = try container.decodeIfPresent(String.self, forKey: ._address) ?? nil
        self.city = try container.decodeIfPresent(String.self, forKey: ._city) ?? nil
        self.zipCode = try container.decodeIfPresent(String.self, forKey: ._zipCode) ?? nil
        self.latitude = try container.decodeIfPresent(Double.self, forKey: ._latitude) ?? nil
        self.longitude = try container.decodeIfPresent(Double.self, forKey: ._longitude) ?? nil
        self.courtCount = try container.decodeIfPresent(Int.self, forKey: ._courtCount) ?? 2
        self.broadcastCode = try container.decodeIfPresent(String.self, forKey: ._broadcastCode) ?? nil
        self.timezone = try container.decodeIfPresent(String.self, forKey: ._timezone) ?? TimeZone.current.identifier
        try super.init(from: decoder)
    }

    override func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.id, forKey: ._id)
        try container.encode(self.creator, forKey: ._creator)
        try container.encode(self.name, forKey: ._name)
        try container.encode(self.acronym, forKey: ._acronym)
        try container.encode(self.phone, forKey: ._phone)
        try container.encode(self.code, forKey: ._code)
        try container.encode(self.address, forKey: ._address)
        try container.encode(self.city, forKey: ._city)
        try container.encode(self.zipCode, forKey: ._zipCode)
        try container.encode(self.latitude, forKey: ._latitude)
        try container.encode(self.longitude, forKey: ._longitude)
        try container.encode(self.courtCount, forKey: ._courtCount)
        try container.encode(self.broadcastCode, forKey: ._broadcastCode)
        try container.encode(self.timezone, forKey: ._timezone)
        try super.encode(to: encoder)
    }

    func creatorValue() -> CustomUser? {
        guard let creator = self.creator else { return nil }
        return Store.main.findById(creator)
    }

    func copy(from other: any Storable) {
        guard let club = other as? BaseClub else { return }
        self.id = club.id
        self.creator = club.creator
        self.name = club.name
        self.acronym = club.acronym
        self.phone = club.phone
        self.code = club.code
        self.address = club.address
        self.city = club.city
        self.zipCode = club.zipCode
        self.latitude = club.latitude
        self.longitude = club.longitude
        self.courtCount = club.courtCount
        self.broadcastCode = club.broadcastCode
        self.timezone = club.timezone
    }

    static func relationships() -> [Relationship] {
        return [
            Relationship(type: CustomUser.self, keyPath: \BaseClub.creator),
        ]
    }

}