package app import ( "context" "log" "os" "path/filepath" "sync" "fast_reader/internal/reader" "fast_reader/internal/settings" "fast_reader/internal/storage" ) type App struct { ctx context.Context mu sync.RWMutex settings settings.Settings settingsPath string } func NewApp() *App { return &App{ settings: settings.Default(), } } func (a *App) Startup(ctx context.Context) { a.ctx = ctx configDir, err := os.UserConfigDir() if err != nil { log.Printf("Could not locate user config directory: %v", err) return } a.mu.Lock() defer a.mu.Unlock() a.settingsPath = filepath.Join( configDir, "fast_reader", "settings.json", ) var saved settings.Settings err = storage.Load(a.settingsPath, &saved) if err != nil { if !os.IsNotExist(err) { log.Printf("Could not load settings: %v", err) } a.settings = settings.Default() return } a.settings = saved.Normalize() log.Println("Settings loaded successfully") } // PrepareText converts pasted text into a sequence of words // ready for RSVP playback. func (a *App) PrepareText(text string) []reader.Word { return reader.Tokenize(text) } // GetVersion returns the application version. func (a *App) GetVersion() string { return "0.1.0" } // GetSettings returns the current application settings. func (a *App) GetSettings() settings.Settings { a.mu.RLock() defer a.mu.RUnlock() return a.settings } // SaveSettings validates and persists application settings. func (a *App) SaveSettings(input settings.Settings) error { normalized := input.Normalize() a.mu.Lock() defer a.mu.Unlock() if a.settingsPath == "" { configDir, err := os.UserConfigDir() if err != nil { return err } a.settingsPath = filepath.Join( configDir, "fast_reader", "settings.json", ) } if err := storage.Save(a.settingsPath, normalized); err != nil { return err } a.settings = normalized return nil } // ResetSettings restores and persists the default settings. func (a *App) ResetSettings() (settings.Settings, error) { defaults := settings.Default() if err := a.SaveSettings(defaults); err != nil { return settings.Settings{}, err } return defaults, nil }