import 'package:shared_preferences/shared_preferences.dart'; import '../models/trip.dart'; import '../repositories/account_repository.dart'; import '../repositories/balance_repository.dart'; import '../repositories/expense_repository.dart'; import 'logger_service.dart'; /// Service qui détecte les voyages terminés et vérifie si les comptes sont réglés. class TripEndService { static const String _prefixKey = 'trip_end_prompted_'; final AccountRepository _accountRepository; final BalanceRepository _balanceRepository; TripEndService() : _accountRepository = AccountRepository(), _balanceRepository = BalanceRepository( expenseRepository: ExpenseRepository(), ); /// Retourne les voyages terminés pour lesquels l'utilisateur n'a pas encore été invité à supprimer. Future> getFinishedTripsNotYetPrompted(List trips) async { final now = DateTime.now(); final prefs = await SharedPreferences.getInstance(); return trips.where((trip) { if (trip.id == null) return false; final isFinished = trip.endDate.isBefore(now); final alreadyPrompted = prefs.getBool('$_prefixKey${trip.id}') ?? false; return isFinished && !alreadyPrompted; }).toList(); } /// Marque un voyage comme déjà invité (ne plus afficher le dialog). Future markTripAsPrompted(String tripId) async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool('$_prefixKey$tripId', true); } /// Vérifie si tous les comptes du voyage sont réglés. /// /// Retourne `true` si aucune dépense n'est enregistrée ou si tous les soldes sont nuls. Future areAccountsSettled(String tripId) async { try { final account = await _accountRepository.getAccountByTripId(tripId); if (account == null) return true; final balance = await _balanceRepository.calculateGroupBalance(account.id); return balance.settlements.isEmpty; } catch (e) { LoggerService.error('TripEndService: Erreur vérification comptes: $e'); return true; } } }