import Foundation enum AppLanguage: String, CaseIterable { case pl, en static var initial: AppLanguage { if let saved = UserDefaults.standard.string(forKey: "language"), let language = AppLanguage(rawValue: saved) { return language } return Locale.current.language.languageCode?.identifier == "pl" ? .pl : .en } } struct UserProfile: Codable, Equatable { var id: Int? var username: String? var email: String? var firstName: String? var lastName: String? var displayName: String? var mobile: String? var postcode: String? var dob: String? var cardNumber: String? var cardAssigned: Bool? enum CodingKeys: String, CodingKey { case id, username, email, mobile, dob case firstName = "first_name" case lastName = "last_name" case displayName = "display_name" case postcode = "kod_pocztowy" case cardNumber = "numer_karty" case cardAssigned = "card_assigned" } } struct Loyalty: Codable, Equatable { var points: FlexibleText? var transactionsValue: FlexibleText? var discountValue: FlexibleText? var cardNumber: FlexibleText? var savings: FlexibleText? var firstName: FlexibleText? enum CodingKeys: String, CodingKey { case points, savings case transactionsValue = "transactions_value" case discountValue = "discount_value" case cardNumber = "card_number" case firstName = "first_name" } } struct FlexibleText: Codable, Equatable { let value: String init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let string = try? container.decode(String.self) { value = string } else if let integer = try? container.decode(Int.self) { value = String(integer) } else if let decimal = try? container.decode(Double.self) { value = String(decimal) } else { value = "" } } } struct KasztelanMessage: Codable, Identifiable, Equatable { let id: Int let title: String let text: String let sentAt: Int enum CodingKeys: String, CodingKey { case id, title, text case sentAt = "sent_at" } } struct APIEnvelope: Codable { var success: Bool? = nil var token: String? = nil var user: UserProfile? = nil var loyalty: Loyalty? = nil var notifications: [KasztelanMessage]? = nil var notification: KasztelanMessage? = nil var key: String? = nil var payload: String? = nil var updatedAt: Int? = nil var code: String? = nil var message: String? = nil enum CodingKeys: String, CodingKey { case success, token, user, loyalty, notifications, notification, key, payload, code, message case updatedAt = "updated_at" } } struct RegistrationForm { var firstName = "" var lastName = "" var email = "" var password = "" var mobile = "" var postcode = "" var dob = "" var cardNumber = "" var acceptsTerms = false } struct ProfileForm { var firstName = "" var lastName = "" var email = "" var mobile = "" var postcode = "" var dob = "" }