import 'dart:convert'; import '../models/delivery_observation.dart'; import '../models/path_history.dart'; import '../storage/prefs_manager.dart'; class StorageService { static const String _pathHistoryPrefix = 'path_history_'; static const String _pendingMessagesKey = 'pending_messages'; static const String _repeaterPasswordsKey = 'repeater_passwords'; static const String _deliveryObservationsKey = 'delivery_observations'; Future savePathHistory( String contactPubKeyHex, ContactPathHistory history, ) async { final prefs = PrefsManager.instance; final key = '$_pathHistoryPrefix$contactPubKeyHex'; final jsonStr = jsonEncode(history.toJson()); await prefs.setString(key, jsonStr); } Future loadPathHistory(String contactPubKeyHex) async { final prefs = PrefsManager.instance; final key = '$_pathHistoryPrefix$contactPubKeyHex'; final jsonStr = prefs.getString(key); if (jsonStr == null) return null; try { final json = jsonDecode(jsonStr) as Map; return ContactPathHistory.fromJson(contactPubKeyHex, json); } catch (e) { return null; } } Future clearPathHistory(String contactPubKeyHex) async { final prefs = PrefsManager.instance; final key = '$_pathHistoryPrefix$contactPubKeyHex'; await prefs.remove(key); } Future clearAllPathHistories() async { final prefs = PrefsManager.instance; final keys = prefs.getKeys(); final pathHistoryKeys = keys.where( (key) => key.startsWith(_pathHistoryPrefix), ); for (final key in pathHistoryKeys) { await prefs.remove(key); } } Future> loadPendingMessages() async { final prefs = PrefsManager.instance; final jsonStr = prefs.getString(_pendingMessagesKey); if (jsonStr == null) return {}; try { final json = jsonDecode(jsonStr) as Map; return json.map((key, value) => MapEntry(key, value as String)); } catch (e) { return {}; } } Future savePendingMessages(Map pending) async { final prefs = PrefsManager.instance; final jsonStr = jsonEncode(pending); await prefs.setString(_pendingMessagesKey, jsonStr); } Future clearPendingMessages() async { final prefs = PrefsManager.instance; await prefs.remove(_pendingMessagesKey); } /// Save a repeater password by public key hex Future saveRepeaterPassword( String repeaterPubKeyHex, String password, ) async { final prefs = PrefsManager.instance; final passwords = await loadRepeaterPasswords(); passwords[repeaterPubKeyHex] = password; final jsonStr = jsonEncode(passwords); await prefs.setString(_repeaterPasswordsKey, jsonStr); } /// Load all saved repeater passwords (map of pubKeyHex -> password) Future> loadRepeaterPasswords() async { final prefs = PrefsManager.instance; final jsonStr = prefs.getString(_repeaterPasswordsKey); if (jsonStr == null) return {}; try { final json = jsonDecode(jsonStr) as Map; return json.map((key, value) => MapEntry(key, value as String)); } catch (e) { return {}; } } /// Get a specific repeater's saved password Future getRepeaterPassword(String repeaterPubKeyHex) async { final passwords = await loadRepeaterPasswords(); return passwords[repeaterPubKeyHex]; } /// Remove a saved repeater password Future removeRepeaterPassword(String repeaterPubKeyHex) async { final prefs = PrefsManager.instance; final passwords = await loadRepeaterPasswords(); passwords.remove(repeaterPubKeyHex); final jsonStr = jsonEncode(passwords); await prefs.setString(_repeaterPasswordsKey, jsonStr); } /// Clear all saved repeater passwords Future clearAllRepeaterPasswords() async { final prefs = PrefsManager.instance; await prefs.remove(_repeaterPasswordsKey); } Future saveDeliveryObservations( List observations, ) async { final prefs = PrefsManager.instance; final jsonStr = jsonEncode(observations.map((o) => o.toJson()).toList()); await prefs.setString(_deliveryObservationsKey, jsonStr); } Future> loadDeliveryObservations() async { final prefs = PrefsManager.instance; final jsonStr = prefs.getString(_deliveryObservationsKey); if (jsonStr == null) return []; try { final list = jsonDecode(jsonStr) as List; return list .map((e) => DeliveryObservation.fromJson(e as Map)) .toList(); } catch (e) { return []; } } Future clearDeliveryObservations() async { final prefs = PrefsManager.instance; await prefs.remove(_deliveryObservationsKey); } }