package services import ( "voicesnap/internal/config" "voicesnap/internal/dock" "voicesnap/internal/language" "voicesnap/internal/model" "voicesnap/internal/startup" ) // ConfigService provides configuration read/write methods to the frontend. type ConfigService struct { cfg *config.Config localeDetector language.SystemLocaleDetector } func NewConfigService(cfg *config.Config) *ConfigService { return NewConfigServiceWithDetector(cfg, language.NewSystemDetector()) } func NewConfigServiceWithDetector(cfg *config.Config, detector language.SystemLocaleDetector) *ConfigService { if detector == nil { detector = language.NewSystemDetector() } return &ConfigService{cfg: cfg, localeDetector: detector} } // GetConfig returns the current configuration. func (s *ConfigService) GetConfig() *config.Config { return s.cfg } // GetLanguageSettings returns the configured and effective UI language. func (s *ConfigService) GetLanguageSettings() language.LanguageSettings { return language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector) } // SetLanguageAuto makes the UI language follow the system language. func (s *ConfigService) SetLanguageAuto() language.LanguageSettings { s.cfg.LanguageMode = config.LanguageModeAuto resolved := language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector) s.cfg.LanguageID = resolved.EffectiveLanguageID config.Save(s.cfg) return language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector) } // SetLanguageManual persists a user-selected UI language. func (s *ConfigService) SetLanguageManual(languageID string) language.LanguageSettings { s.cfg.LanguageMode = config.LanguageModeManual s.cfg.LanguageID = model.NormalizeLanguageID(languageID) config.Save(s.cfg) return language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector) } // SetAutoHide sets the auto-hide indicator preference. func (s *ConfigService) SetAutoHide(enabled bool) { s.cfg.AutoHide = enabled config.Save(s.cfg) } // GetAutoHide returns the auto-hide preference. func (s *ConfigService) GetAutoHide() bool { return s.cfg.AutoHide } // SetSoundFeedback sets the sound feedback preference. func (s *ConfigService) SetSoundFeedback(enabled bool) { s.cfg.SoundFeedback = enabled config.Save(s.cfg) } // GetSoundFeedback returns the sound feedback preference. func (s *ConfigService) GetSoundFeedback() bool { return s.cfg.SoundFeedback } // SetHotkeyMode sets the voice input interaction mode. func (s *ConfigService) SetHotkeyMode(mode string) { s.cfg.HotkeyMode = config.NormalizeHotkeyMode(mode) config.Save(s.cfg) } // GetHotkeyMode returns the voice input interaction mode. func (s *ConfigService) GetHotkeyMode() string { s.cfg.HotkeyMode = config.NormalizeHotkeyMode(s.cfg.HotkeyMode) return s.cfg.HotkeyMode } // SetCopyToClipboard sets whether recognized text remains in the clipboard after input. func (s *ConfigService) SetCopyToClipboard(enabled bool) { s.cfg.CopyToClipboard = enabled config.Save(s.cfg) } // GetCopyToClipboard returns whether recognized text remains in the clipboard after input. func (s *ConfigService) GetCopyToClipboard() bool { return s.cfg.CopyToClipboard } // SetHideDockIcon sets whether the app should hide its Dock icon on macOS. func (s *ConfigService) SetHideDockIcon(enabled bool) { s.cfg.HideDockIcon = enabled config.Save(s.cfg) dock.SetHidden(enabled) } // GetHideDockIcon returns whether the Dock icon should be hidden. func (s *ConfigService) GetHideDockIcon() bool { return s.cfg.HideDockIcon } // IsStartupEnabled returns whether the app is set to start at login. func (s *ConfigService) IsStartupEnabled() bool { return startup.IsEnabled() } // SetStartupEnabled enables or disables start at login. func (s *ConfigService) SetStartupEnabled(enabled bool) error { return startup.SetEnabled(enabled) }