Files
FamilyMealPlanner/MealMood/Models/AppSettings.swift
T
alexandrev-tibco e593453abd Version casi lista
2026-02-17 13:34:02 +01:00

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