/// Modèle portefeuille électronique. class Wallet { const Wallet({ required this.currency, required this.currentBalance, this.status = 'active', }); final String currency; final double currentBalance; final String status; factory Wallet.fromJson(Map json) { return Wallet( currency: json['currency'] as String? ?? 'EUR', currentBalance: (json['current_balance'] as num?)?.toDouble() ?? 0, status: json['status'] as String? ?? 'active', ); } } /// Mouvement sur le portefeuille. class WalletTransaction { const WalletTransaction({ required this.uuid, required this.type, required this.amount, required this.balanceAfter, required this.createdAt, this.metadata = const {}, }); final String uuid; final String type; final double amount; final double balanceAfter; final DateTime? createdAt; final Map metadata; String get displayLabel { final label = metadata['label']; if (label is String && label.isNotEmpty) { return label; } return switch (type) { 'credit' => 'Crédit', 'debit' => 'Débit', 'refund' => 'Remboursement', 'hold' => 'Blocage', 'release' => 'Libération', 'adjustment' => 'Ajustement', _ => type, }; } String? get displaySubtitle { final stripeMap = _asStringMap(metadata['stripe']); if (stripeMap != null) { final brand = stripeMap['card_brand']; final last4 = stripeMap['card_last4']; if (brand is String && last4 is String) { return '${_formatCardBrand(brand)} •••• $last4'; } final paymentIntentId = stripeMap['payment_intent_id']; if (paymentIntentId is String && paymentIntentId.isNotEmpty) { return 'Stripe $paymentIntentId'; } } final providerPaymentId = metadata['provider_payment_id']; if (providerPaymentId is String && providerPaymentId.isNotEmpty) { return providerPaymentId; } return null; } static Map? _asStringMap(dynamic value) { if (value == null) return null; if (value is Map) return value; if (value is Map) return Map.from(value); return null; } static String _formatCardBrand(String brand) { if (brand.isEmpty) return 'Carte'; return switch (brand.toLowerCase()) { 'visa' => 'Visa', 'mastercard' => 'Mastercard', 'amex' => 'Amex', _ => brand[0].toUpperCase() + brand.substring(1), }; } factory WalletTransaction.fromJson(Map json) { return WalletTransaction( uuid: json['uuid'] as String, type: json['type'] as String, amount: (json['amount'] as num?)?.toDouble() ?? 0, balanceAfter: (json['balance_after'] as num?)?.toDouble() ?? 0, createdAt: json['created_at'] != null ? DateTime.tryParse(json['created_at'] as String) : null, metadata: _parseMetadata(json['metadata']), ); } static Map _parseMetadata(dynamic value) { if (value == null) { return const {}; } if (value is Map) { return value; } if (value is Map) { return Map.from(value); } return const {}; } }