package storage import ( "strings" "time" "gardomatic.kleiax.de/internal/platform/validate" ) // ApplicationSettings contains application-wide automation settings. type ApplicationSettings struct { LifecycleStatusEnabled bool `json:"lifecycle_status_enabled"` LifecycleRemovalMonth int `json:"lifecycle_removal_month"` LifecycleRemovalDay int `json:"lifecycle_removal_day"` Timezone string `json:"timezone"` UpdatedAt time.Time `json:"updated_at"` Version int `json:"version"` } // ApplicationSettingsModelInterface persists global settings and applies lifecycle cleanup atomically. type ApplicationSettingsModelInterface interface { Get() (ApplicationSettings, error) Update(settings ApplicationSettings) (ApplicationSettings, error) RemoveExpiredPlants(asOf time.Time, removalMonth, removalDay int) (int, error) } // ValidateApplicationSettings validates global automation configuration. func ValidateApplicationSettings(v *validate.Validator, settings ApplicationSettings) { v.Check(settings.LifecycleRemovalMonth >= 1 && settings.LifecycleRemovalMonth <= 12, "lifecycle_removal_month", "must be between 1 and 12") v.Check(settings.LifecycleRemovalDay >= 1 && settings.LifecycleRemovalDay <= 31, "lifecycle_removal_day", "must be between 1 and 31") v.Check(strings.TrimSpace(settings.Timezone) != "", "timezone", "must be provided") if strings.TrimSpace(settings.Timezone) != "" { _, err := time.LoadLocation(settings.Timezone) v.Check(err == nil, "timezone", "must be a valid IANA timezone") } }