import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import '../models/home_config.dart'; /// Сервис для хранения списка "домов" и текущего выбранного. /// Данные лежат в SharedPreferences как JSON-массив. class SettingsService { static const String _homesKey = 'ignis_homes'; static const String _currentHomeKey = 'ignis_current_home_id'; /// Загрузить все дома Future> getHomes() async { final prefs = await SharedPreferences.getInstance(); final raw = prefs.getString(_homesKey); if (raw == null || raw.isEmpty) return []; final list = jsonDecode(raw) as List; return list.map((e) => HomeConfig.fromJson(e as Map)).toList(); } /// Сохранить весь список домов Future saveHomes(List homes) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_homesKey, jsonEncode(homes.map((h) => h.toJson()).toList())); } /// Добавить или обновить дом Future upsertHome(HomeConfig home) async { final homes = await getHomes(); final idx = homes.indexWhere((h) => h.id == home.id); if (idx >= 0) { homes[idx] = home; } else { homes.add(home); } await saveHomes(homes); } /// Удалить дом по id Future deleteHome(String id) async { final homes = await getHomes(); homes.removeWhere((h) => h.id == id); await saveHomes(homes); // Если удалили текущий -- сбрасываем выбор final currentId = await getCurrentHomeId(); if (currentId == id) { await setCurrentHomeId(homes.isNotEmpty ? homes.first.id : null); } } /// Получить id текущего активного дома Future getCurrentHomeId() async { final prefs = await SharedPreferences.getInstance(); return prefs.getString(_currentHomeKey); } /// Установить текущий дом Future setCurrentHomeId(String? id) async { final prefs = await SharedPreferences.getInstance(); if (id == null) { await prefs.remove(_currentHomeKey); } else { await prefs.setString(_currentHomeKey, id); } } /// Удобный метод: получить текущий HomeConfig или null Future getCurrentHome() async { final homes = await getHomes(); final id = await getCurrentHomeId(); if (id == null && homes.isNotEmpty) return homes.first; try { return homes.firstWhere((h) => h.id == id); } catch (_) { return homes.isNotEmpty ? homes.first : null; } } }