package internal import ( "encoding/json" "fmt" "os" "path/filepath" ) type ConfigManager struct { config *Config path string } func NewConfigManager() (*ConfigManager, error) { home, err := os.UserHomeDir() if err != nil { return nil, err } dir := filepath.Join(home, ".config", "zmk-battman") path := filepath.Join(dir, "config.json") if err := os.MkdirAll(dir, 0755); err != nil { return nil, err } cm := &ConfigManager{ path: path, config: &Config{ UpdateInterval: 30, LowBatteryThreshold: 20, ShowNotifications: true, }, } cm.Load() return cm, nil } func (cm *ConfigManager) Load() error { data, err := os.ReadFile(cm.path) if err != nil { return nil // Use defaults if file doesn't exist } return json.Unmarshal(data, cm.config) } func (cm *ConfigManager) Save() error { data, err := json.MarshalIndent(cm.config, "", " ") if err != nil { return err } return os.WriteFile(cm.path, data, 0644) } func (cm *ConfigManager) SetDevice(name, address string) { cm.config.Name = name cm.config.Address = address } func (cm *ConfigManager) SetInterval(interval int) { if interval >= 5 && interval <= 300 { cm.config.UpdateInterval = interval } } func (cm *ConfigManager) SetLowBatteryThreshold(threshold int) { if threshold >= 5 && threshold <= 50 { cm.config.LowBatteryThreshold = threshold } } func (cm *ConfigManager) SetNotifications(enabled bool) { cm.config.ShowNotifications = enabled } func (cm *ConfigManager) IsConfigured() bool { return cm.config.Address != "" } func (cm *ConfigManager) Get() *Config { return cm.config } func (cm *ConfigManager) Print() { fmt.Printf("Configuration:\n") fmt.Printf(" Device: %s (%s)\n", cm.config.Name, cm.config.Address) fmt.Printf(" Update interval: %d seconds\n", cm.config.UpdateInterval) fmt.Printf(" Low battery threshold: %d%%\n", cm.config.LowBatteryThreshold) fmt.Printf(" Notifications: %v\n", cm.config.ShowNotifications) fmt.Printf(" Config file: %s\n", cm.path) } func (cm *ConfigManager) InitWithDefaults() error { home, err := os.UserHomeDir() if err != nil { return err } dir := filepath.Join(home, ".config", "zmk-battman") cm.path = filepath.Join(dir, "config.json") if err := os.MkdirAll(dir, 0755); err != nil { return err } cm.config = &Config{ UpdateInterval: 30, LowBatteryThreshold: 20, ShowNotifications: true, } return nil }