import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import '../models/action_template.dart'; /// Service for caching server lists to prevent categories from disappearing /// when SDK Bridge is temporarily unavailable during service restarts class ServerCacheService { static const String _gcoreServersKey = 'cached_gcore_servers'; static const String _gscServersKey = 'cached_gsc_servers'; static const String _cacheTimestampKey = 'server_cache_timestamp'; /// Save G-Core servers to cache static Future cacheGCoreServers(List servers) async { final prefs = await SharedPreferences.getInstance(); final json = jsonEncode(servers.map((s) => s.toJson()).toList()); await prefs.setString(_gcoreServersKey, json); await prefs.setInt(_cacheTimestampKey, DateTime.now().millisecondsSinceEpoch); print('[ServerCache] Cached ${servers.length} G-Core servers'); } /// Save GSC servers to cache static Future cacheGSCServers(List servers) async { final prefs = await SharedPreferences.getInstance(); final json = jsonEncode(servers.map((s) => s.toJson()).toList()); await prefs.setString(_gscServersKey, json); await prefs.setInt(_cacheTimestampKey, DateTime.now().millisecondsSinceEpoch); print('[ServerCache] Cached ${servers.length} GSC servers'); } /// Save both server lists static Future cacheServers({ required List gcoreServers, required List gscServers, }) async { await cacheGCoreServers(gcoreServers); await cacheGSCServers(gscServers); } /// Load cached G-Core servers static Future> getCachedGCoreServers() async { final prefs = await SharedPreferences.getInstance(); final json = prefs.getString(_gcoreServersKey); if (json == null) { print('[ServerCache] No cached G-Core servers found'); return []; } try { final list = jsonDecode(json) as List; final servers = list.map((item) => ServerInfo.fromJson(item as Map)).toList(); print('[ServerCache] Loaded ${servers.length} cached G-Core servers'); return servers; } catch (e) { print('[ServerCache] Error loading cached G-Core servers: $e'); return []; } } /// Load cached GSC servers static Future> getCachedGSCServers() async { final prefs = await SharedPreferences.getInstance(); final json = prefs.getString(_gscServersKey); if (json == null) { print('[ServerCache] No cached GSC servers found'); return []; } try { final list = jsonDecode(json) as List; final servers = list.map((item) => ServerInfo.fromJson(item as Map)).toList(); print('[ServerCache] Loaded ${servers.length} cached GSC servers'); return servers; } catch (e) { print('[ServerCache] Error loading cached GSC servers: $e'); return []; } } /// Get cache age in milliseconds static Future getCacheAge() async { final prefs = await SharedPreferences.getInstance(); final timestamp = prefs.getInt(_cacheTimestampKey); if (timestamp == null) return null; return DateTime.now().millisecondsSinceEpoch - timestamp; } /// Clear all cached server data static Future clearCache() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove(_gcoreServersKey); await prefs.remove(_gscServersKey); await prefs.remove(_cacheTimestampKey); print('[ServerCache] Cache cleared'); } }