import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:pshared/models/payment/wallet.dart'; import 'package:pshared/provider/payment/wallets.dart'; class WalletsController with ChangeNotifier { late WalletsProvider _wallets; // If you want per-org isolation, we reset when org changes. String? _orgRef; // Visibility is UI-only: store hidden wallet ids here. final Set _hiddenWalletIds = {}; String? _selectedWalletId; bool get isLoading => _wallets.isLoading; Exception? get error => _wallets.error; /// Inject / update dependency (use ProxyProvider). void update(WalletsProvider wallets) { _wallets = wallets; final nextOrgRef = wallets.organizationId; final orgChanged = nextOrgRef != _orgRef; if (orgChanged) { _orgRef = nextOrgRef; _hiddenWalletIds.clear(); _selectedWalletId = null; } // Prune hidden ids for wallets that no longer exist. final ids = wallets.wallets.map((w) => w.id).toSet(); final beforeHiddenLen = _hiddenWalletIds.length; _hiddenWalletIds.removeWhere((id) => !ids.contains(id)); // Ensure selection is valid. final beforeSelected = _selectedWalletId; _selectedWalletId = _resolveSelectedId( currentId: _selectedWalletId, wallets: wallets.wallets, hiddenIds: _hiddenWalletIds, ); final selectionChanged = beforeSelected != _selectedWalletId; final hiddenChanged = beforeHiddenLen != _hiddenWalletIds.length; if (orgChanged || selectionChanged || hiddenChanged) { notifyListeners(); } } List get wallets => _wallets.wallets; bool isHidden(String walletId) => _hiddenWalletIds.contains(walletId); List get visibleWallets => wallets.where((w) => !_hiddenWalletIds.contains(w.id)).toList(growable: false); Wallet? get selectedWallet { final id = _selectedWalletId; if (id == null) return null; return wallets.firstWhereOrNull((w) => w.id == id); } String? get selectedWalletId => _selectedWalletId; void selectWallet(Wallet wallet) => selectWalletId(wallet.id); void selectWalletId(String walletId) { if (_selectedWalletId == walletId) return; // Allow selecting hidden wallet if you want; if not, block it: // if (isHidden(walletId)) return; _selectedWalletId = walletId; notifyListeners(); } void toggleVisibility(String walletId) { final existed = _hiddenWalletIds.remove(walletId); if (!existed) _hiddenWalletIds.add(walletId); // If we hid the selected wallet, move selection to next visible. _selectedWalletId = _resolveSelectedId( currentId: _selectedWalletId, wallets: wallets, hiddenIds: _hiddenWalletIds, ); notifyListeners(); } void showAll() { if (_hiddenWalletIds.isEmpty) return; _hiddenWalletIds.clear(); _selectedWalletId = _resolveSelectedId( currentId: _selectedWalletId, wallets: wallets, hiddenIds: _hiddenWalletIds, ); notifyListeners(); } String? _resolveSelectedId({ required String? currentId, required List wallets, required Set hiddenIds, }) { if (wallets.isEmpty) return null; // Keep current if exists and is not hidden. if (currentId != null) { final exists = wallets.any((w) => w.id == currentId); if (exists && !hiddenIds.contains(currentId)) return currentId; } // Pick first visible. final firstVisible = wallets.firstWhereOrNull((w) => !hiddenIds.contains(w.id)); if (firstVisible != null) return firstVisible.id; // All hidden: fall back to first wallet id (or return null if you prefer). return wallets.first.id; } }