import 'dart:convert'; import 'dart:math'; import 'package:shared_preferences/shared_preferences.dart'; /// Device-local bookmarks for public (unauthenticated) app usage. class LocalBookmarksService { static const _storageKey = 'local_bookmarks'; static const _deviceIdKey = 'device_id'; static Future deviceId() async { final prefs = await SharedPreferences.getInstance(); var id = prefs.getString(_deviceIdKey); if (id == null || id.isEmpty) { id = '${DateTime.now().millisecondsSinceEpoch}_${Random().nextInt(1 << 32)}'; await prefs.setString(_deviceIdKey, id); } return id; } static Future>> getAll() async { final prefs = await SharedPreferences.getInstance(); final raw = prefs.getString(_storageKey); if (raw == null || raw.isEmpty) return []; final decoded = jsonDecode(raw); if (decoded is! List) return []; return decoded .map((e) => Map.from(e as Map)) .toList(); } static Future _saveAll(List> bookmarks) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_storageKey, jsonEncode(bookmarks)); } static Future?> findByDataset(String dataset) async { final bookmarks = await getAll(); for (final b in bookmarks) { if (b['data_set'] == dataset || b['dataset'] == dataset) { return b; } } return null; } static Future> add({ required String dataset, required String bgColor, required String mainTopic, required String title, required String keyParam, }) async { final bookmarks = await getAll(); final id = '${DateTime.now().millisecondsSinceEpoch}_${Random().nextInt(1 << 32)}'; final entry = { 'id': id, 'data_set': dataset, 'dataset': dataset, 'bgColor': bgColor, 'main_topic': mainTopic, 'mainTopic': mainTopic, 'data_set_tile_heading': title, 'title': title, 'keyParam': keyParam, 'created': DateTime.now().toIso8601String(), }; bookmarks.removeWhere( (b) => b['data_set'] == dataset || b['dataset'] == dataset, ); bookmarks.add(entry); await _saveAll(bookmarks); return entry; } static Future remove(String id) async { final bookmarks = await getAll(); bookmarks.removeWhere((b) => b['id'] == id); await _saveAll(bookmarks); } }