141 lines
3.7 KiB
Swift
141 lines
3.7 KiB
Swift
import Foundation
|
|
import SwiftData
|
|
|
|
@Model
|
|
final class AppSettings {
|
|
var mealWindows: String // "dinnerOnly", "lunchOnly", "both"
|
|
var includeWeekends: Bool
|
|
var language: String // "spanish", "english"
|
|
|
|
var calendarId: String?
|
|
var syncEnabled: Bool
|
|
var syncMode: String? // "weekComplete", "manual"
|
|
var lunchTime: Date
|
|
var dinnerTime: Date
|
|
var eventDuration: Int
|
|
var eventPrefix: String
|
|
var reminderMinutesBefore: Int?
|
|
var iCloudSyncEnabled: Bool?
|
|
|
|
var isPremium: Bool
|
|
var onboardingCompleted: Bool
|
|
|
|
init() {
|
|
self.mealWindows = "dinnerOnly"
|
|
self.includeWeekends = true
|
|
self.language = "system"
|
|
self.calendarId = nil
|
|
self.syncEnabled = false
|
|
self.syncMode = CalendarSyncMode.weekComplete.rawValue
|
|
// Default lunch time 14:00
|
|
var lunchComponents = DateComponents()
|
|
lunchComponents.hour = 14
|
|
lunchComponents.minute = 0
|
|
self.lunchTime = Calendar.current.date(from: lunchComponents) ?? Date()
|
|
// Default dinner time 21:00
|
|
var dinnerComponents = DateComponents()
|
|
dinnerComponents.hour = 21
|
|
dinnerComponents.minute = 0
|
|
self.dinnerTime = Calendar.current.date(from: dinnerComponents) ?? Date()
|
|
self.eventDuration = 60
|
|
self.eventPrefix = "🍽️"
|
|
self.reminderMinutesBefore = nil
|
|
self.iCloudSyncEnabled = true
|
|
self.isPremium = false
|
|
self.onboardingCompleted = false
|
|
}
|
|
|
|
var mealWindowsEnum: MealWindows {
|
|
get { MealWindows(rawValue: mealWindows) ?? .dinnerOnly }
|
|
set { mealWindows = newValue.rawValue }
|
|
}
|
|
|
|
var languageEnum: AppLanguage {
|
|
get { AppLanguage(rawValue: language) ?? .system }
|
|
set { language = newValue.rawValue }
|
|
}
|
|
|
|
var syncModeEnum: CalendarSyncMode {
|
|
get { CalendarSyncMode(rawValue: syncMode ?? "") ?? .weekComplete }
|
|
set { syncMode = newValue.rawValue }
|
|
}
|
|
|
|
var iCloudSyncEnabledResolved: Bool {
|
|
get { iCloudSyncEnabled ?? true }
|
|
set { iCloudSyncEnabled = newValue }
|
|
}
|
|
}
|
|
|
|
enum MealWindows: String, CaseIterable {
|
|
case dinnerOnly
|
|
case lunchOnly
|
|
case both
|
|
|
|
var localizedKey: String {
|
|
switch self {
|
|
case .dinnerOnly: return "meal_windows_dinner_only"
|
|
case .lunchOnly: return "meal_windows_lunch_only"
|
|
case .both: return "meal_windows_both"
|
|
}
|
|
}
|
|
|
|
var icon: String {
|
|
switch self {
|
|
case .dinnerOnly: return "moon.stars.fill"
|
|
case .lunchOnly: return "sun.max.fill"
|
|
case .both: return "sun.and.horizon.fill"
|
|
}
|
|
}
|
|
}
|
|
|
|
enum AppLanguage: String, CaseIterable {
|
|
case system
|
|
case spanish
|
|
case english
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .system: return "System"
|
|
case .spanish: return "Español"
|
|
case .english: return "English"
|
|
}
|
|
}
|
|
|
|
var localeIdentifier: String {
|
|
switch self {
|
|
case .system: return resolved().localeIdentifier
|
|
case .spanish: return "es"
|
|
case .english: return "en"
|
|
}
|
|
}
|
|
|
|
func resolved() -> AppLanguage {
|
|
if self != .system { return self }
|
|
return Locale.current.identifier.lowercased().hasPrefix("es") ? .spanish : .english
|
|
}
|
|
}
|
|
|
|
enum MealType: String, Codable, CaseIterable {
|
|
case lunch
|
|
case dinner
|
|
|
|
var icon: String {
|
|
switch self {
|
|
case .lunch: return "sun.max.fill"
|
|
case .dinner: return "moon.stars.fill"
|
|
}
|
|
}
|
|
}
|
|
|
|
enum CalendarSyncMode: String, CaseIterable {
|
|
case weekComplete
|
|
case manual
|
|
|
|
var localizedKey: String {
|
|
switch self {
|
|
case .weekComplete: return "settings_sync_mode_week_complete"
|
|
case .manual: return "settings_sync_mode_manual"
|
|
}
|
|
}
|
|
}
|