import 'package:flutter/material.dart'; import 'package:pshared/models/payment/status.dart'; import 'package:pweb/models/wallet/wallet_transaction.dart'; import 'package:pweb/providers/wallet_transactions.dart'; class WalletTransactionsController extends ChangeNotifier { List _filteredTransactions = []; DateTimeRange? _dateRange; final Set _selectedStatuses = {}; final Set _selectedTypes = {}; WalletTransactionsProvider? _provider; List get transactions => _provider?.transactions ?? const []; List get filteredTransactions => _filteredTransactions; DateTimeRange? get dateRange => _dateRange; Set get selectedStatuses => _selectedStatuses; Set get selectedTypes => _selectedTypes; bool get isLoading => _provider?.isLoading ?? false; String? get error => _provider?.error; bool get hasFilters => _dateRange != null || _selectedStatuses.isNotEmpty || _selectedTypes.isNotEmpty; void update(WalletTransactionsProvider provider) { if (identical(_provider, provider)) return; _provider?.removeListener(_onProviderChanged); _provider = provider; _provider?.addListener(_onProviderChanged); _rebuildFiltered(notify: false); notifyListeners(); } void setDateRange(DateTimeRange? range) { _dateRange = range; _rebuildFiltered(); } void toggleStatus(OperationStatus status) { if (_selectedStatuses.contains(status)) { _selectedStatuses.remove(status); } else { _selectedStatuses.add(status); } _rebuildFiltered(); } void toggleType(WalletTransactionType type) { if (_selectedTypes.contains(type)) { _selectedTypes.remove(type); } else { _selectedTypes.add(type); } _rebuildFiltered(); } void resetFilters() { _dateRange = null; _selectedStatuses.clear(); _selectedTypes.clear(); _rebuildFiltered(); } void _onProviderChanged() { _rebuildFiltered(); } void _rebuildFiltered({bool notify = true}) { final source = _provider?.transactions ?? const []; final activeWalletId = _provider?.walletId; _filteredTransactions = source.where((tx) { final walletMatch = activeWalletId == null || tx.walletId == activeWalletId; final statusMatch = _selectedStatuses.isEmpty || _selectedStatuses.contains(tx.status); final typeMatch = _selectedTypes.isEmpty || _selectedTypes.contains(tx.type); final dateMatch = _dateRange == null || (tx.date.isAfter( _dateRange!.start.subtract(const Duration(seconds: 1)), ) && tx.date.isBefore( _dateRange!.end.add(const Duration(seconds: 1)), )); return walletMatch && statusMatch && typeMatch && dateMatch; }).toList(); if (notify) notifyListeners(); } @override void dispose() { _provider?.removeListener(_onProviderChanged); super.dispose(); } }