import 'package:shared_preferences/shared_preferences.dart'; import 'package:travel_mate/models/packing_item.dart'; /// Service handling shared packing lists per trip. /// /// Uses local `SharedPreferences` for fast offline access. The list can later /// be synced remotely without changing the calling code. class PackingService { /// Loads packing items for a trip. Returns empty list if none/corrupted. Future> loadItems(String tripId) async { final prefs = await SharedPreferences.getInstance(); final raw = prefs.getString(_key(tripId)); if (raw == null) return const []; try { return PackingItem.decodeList(raw); } catch (_) { await prefs.remove(_key(tripId)); return const []; } } /// Saves complete list. Future saveItems(String tripId, List items) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_key(tripId), PackingItem.encodeList(items)); } /// Adds one item. Future> addItem(String tripId, PackingItem item) async { final current = await loadItems(tripId); final updated = [...current, item]; await saveItems(tripId, updated); return updated; } /// Toggles packed flag. Future> toggleItem(String tripId, String itemId) async { final current = await loadItems(tripId); final updated = current .map((i) { if (i.id != itemId) return i; return i.copyWith(isPacked: !i.isPacked); }) .toList(growable: false); await saveItems(tripId, updated); return updated; } /// Deletes an item. Future> deleteItem(String tripId, String itemId) async { final current = await loadItems(tripId); final updated = current.where((i) => i.id != itemId).toList(); await saveItems(tripId, updated); return updated; } /// Suggests a starter template based on duration/weather (simplified here). List suggestedItems({required int nights, required bool cold}) { final base = [ 'Passeport/ID', 'Billets / PNR', 'Chargeurs et adaptateurs', 'Trousse de secours', 'Assurance voyage', ]; if (cold) { base.addAll(['Veste chaude', 'Gants', 'Bonnet', 'Chaussettes chaudes']); } else { base.addAll(['Crème solaire', 'Lunettes de soleil', 'Maillot de bain']); } if (nights > 4) { base.add('Lessive/ziplock'); } return base; } String _key(String tripId) => 'packing_$tripId'; }