import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'cart_provider.dart'; import '../../../settings/presentation/providers/settings_provider.dart'; part 'cart_total_provider.g.dart'; /// Cart totals calculation provider @riverpod class CartTotal extends _$CartTotal { @override CartTotalData build() { final itemsAsync = ref.watch(cartProvider); final settingsAsync = ref.watch(settingsProvider); final items = itemsAsync.when( data: (data) => data, loading: () => [], error: (_, __) => [], ); final settings = settingsAsync.when( data: (data) => data, loading: () => null, error: (_, __) => null, ); // Calculate subtotal final subtotal = items.fold( 0.0, (sum, item) => sum + item.lineTotal, ); // Calculate tax final taxRate = settings?.taxRate ?? 0.0; final tax = subtotal * taxRate; // Calculate total final total = subtotal + tax; return CartTotalData( subtotal: subtotal, tax: tax, taxRate: taxRate, total: total, itemCount: items.length, ); } /// Apply discount amount to total double applyDiscount(double discountAmount) { final currentTotal = state.total; return (currentTotal - discountAmount).clamp(0.0, double.infinity); } /// Apply discount percentage to total double applyDiscountPercentage(double discountPercent) { final currentTotal = state.total; final discountAmount = currentTotal * (discountPercent / 100); return (currentTotal - discountAmount).clamp(0.0, double.infinity); } } /// Cart total data model class CartTotalData { final double subtotal; final double tax; final double taxRate; final double total; final int itemCount; const CartTotalData({ required this.subtotal, required this.tax, required this.taxRate, required this.total, required this.itemCount, }); @override String toString() { return 'CartTotalData(subtotal: $subtotal, tax: $tax, total: $total, items: $itemCount)'; } }