// =========================================================================== // FILE: lib/services/storage_service.dart // =========================================================================== import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import '../core/app_colors.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/foundation.dart'; class StorageService { static final StorageService instance = StorageService._internal(); StorageService._internal(); late SharedPreferences _prefs; Future init() async { _prefs = await SharedPreferences.getInstance(); _checkDailyQuests(); } // Doodle รจ il nuovo tema di partenza (index 0) int get savedThemeIndex => _prefs.getInt('theme') ?? AppThemeType.doodle.index; Future saveTheme(AppThemeType theme) async => await _prefs.setInt('theme', theme.index); int get savedRadius => _prefs.getInt('radius') ?? 2; Future saveRadius(int radius) async => await _prefs.setInt('radius', radius); bool get isMuted => _prefs.getBool('isMuted') ?? false; Future saveMuted(bool muted) async => await _prefs.setBool('isMuted', muted); int get totalXP => _prefs.getInt('totalXP') ?? 0; Future addXP(int xp) async { await _prefs.setInt('totalXP', totalXP + xp); syncLeaderboard(); } int get playerLevel => (totalXP / 100).floor() + 1; int get wins => _prefs.getInt('wins') ?? 0; Future addWin() async { await _prefs.setInt('wins', wins + 1); syncLeaderboard(); } int get losses => _prefs.getInt('losses') ?? 0; Future addLoss() async => await _prefs.setInt('losses', losses + 1); int get cpuLevel => _prefs.getInt('cpuLevel') ?? 1; Future saveCpuLevel(int level) async => await _prefs.setInt('cpuLevel', level); String get playerName => _prefs.getString('playerName') ?? ''; Future savePlayerName(String name) async { await _prefs.setString('playerName', name); syncLeaderboard(); } Future syncLeaderboard() async { if (playerName.isNotEmpty) { try { final user = FirebaseAuth.instance.currentUser; if (user != null) { await FirebaseFirestore.instance.collection('leaderboard').doc(user.uid).set({ 'name': playerName, 'xp': totalXP, 'level': playerLevel, 'wins': wins, 'lastActive': FieldValue.serverTimestamp(), }, SetOptions(merge: true)); } } catch(e) { debugPrint("Errore sinc. classifica: $e"); } } } // --- NUOVO: GESTIONE PREFERITI (RUBRICA LOCALE) --- List> get favorites { List favs = _prefs.getStringList('favorites') ?? []; return favs.map((e) => Map.from(jsonDecode(e))).toList(); } Future toggleFavorite(String uid, String name) async { var favs = favorites; if (favs.any((f) => f['uid'] == uid)) { favs.removeWhere((f) => f['uid'] == uid); // Rimuove se esiste } else { favs.add({'uid': uid, 'name': name}); // Aggiunge se non esiste } await _prefs.setStringList('favorites', favs.map((e) => jsonEncode(e)).toList()); } bool isFavorite(String uid) { return favorites.any((f) => f['uid'] == uid); } // --------------------------------------------------- void _checkDailyQuests() { String today = DateTime.now().toIso8601String().substring(0, 10); String lastDate = _prefs.getString('quest_date') ?? ''; if (today != lastDate) { _prefs.setString('quest_date', today); _prefs.setInt('q1_type', 0); _prefs.setInt('q1_prog', 0); _prefs.setInt('q1_target', 3); _prefs.setInt('q2_type', 1); _prefs.setInt('q2_prog', 0); _prefs.setInt('q2_target', 2); _prefs.setInt('q3_type', 2); _prefs.setInt('q3_prog', 0); _prefs.setInt('q3_target', 2); } } Future updateQuestProgress(int type, int amount) async { for(int i=1; i<=3; i++) { if (_prefs.getInt('q${i}_type') == type) { int prog = _prefs.getInt('q${i}_prog') ?? 0; int target = _prefs.getInt('q${i}_target') ?? 1; if (prog < target) { _prefs.setInt('q${i}_prog', prog + amount); } } } } List> get matchHistory { List history = _prefs.getStringList('matchHistory') ?? []; return history.map((e) => jsonDecode(e) as Map).toList(); } Future saveMatchToHistory({required String myName, required String opponent, required int myScore, required int oppScore, required bool isOnline}) async { List history = _prefs.getStringList('matchHistory') ?? []; Map match = { 'date': DateTime.now().toIso8601String(), 'myName': myName, 'opponent': opponent, 'myScore': myScore, 'oppScore': oppScore, 'isOnline': isOnline, }; history.insert(0, jsonEncode(match)); if (history.length > 50) history = history.sublist(0, 50); await _prefs.setStringList('matchHistory', history); } }