import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import '../../../providers/auth_provider.dart'; import '../../../providers/dashboard_provider.dart'; import '../../../core/responsive.dart'; import '../../widgets/app_drawer.dart'; class DashboardPage extends ConsumerWidget { const DashboardPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final authState = ref.watch(authProvider); final agente = authState.agente; final dashboardAsync = agente != null ? ref.watch(dashboardProvider(agente.idAgente)) : null; final theme = Theme.of(context); return Scaffold( appBar: AppBar(title: Text('Benvenuto, ${agente?.ragioneSociale ?? ''}')), drawer: AppDrawer( agente: agente, onDashboard: () => context.go('/dashboard'), onOrders: () => context.go('/dashboard/orders'), onCustomers: () => context.go('/dashboard/customers'), onCatalog: () => context.go('/dashboard/catalog'), onPromotions: () => context.go('/dashboard/promotions'), onPayments: () => context.go('/dashboard/payments'), onStatistics: () => context.go('/dashboard/statistics'), onSync: () => context.go('/dashboard/sync'), onLogout: () => ref.read(authProvider.notifier).logout(), ), body: dashboardAsync?.when( data: (data) => _DashboardContent(data: data, theme: theme, context: context), loading: () => const Center(child: CircularProgressIndicator()), error: (e, _) => Center(child: Text('Errore: $e')), ) ?? const Center(child: CircularProgressIndicator()), ); } } class _DashboardContent extends StatelessWidget { final DashboardData data; final ThemeData theme; final BuildContext context; const _DashboardContent({required this.data, required this.theme, required this.context}); @override Widget build(BuildContext context) { return SingleChildScrollView( padding: ResponsiveBreakpoints.padding(context), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Quick action cards Wrap( spacing: 12, runSpacing: 12, children: [ _ActionCard( icon: Icons.receipt_long, label: 'Nuovo Ordine', color: theme.colorScheme.primary, onTap: () => this.context.go('/dashboard/orders/new'), ), _ActionCard( icon: Icons.people, label: 'Clienti', color: theme.colorScheme.tertiary, onTap: () => this.context.go('/dashboard/customers'), ), _ActionCard( icon: Icons.inventory_2, label: 'Catalogo', color: theme.colorScheme.secondary, onTap: () => this.context.go('/dashboard/catalog'), ), _ActionCard( icon: Icons.sync, label: 'Sincronizza', color: theme.colorScheme.error, onTap: () => this.context.go('/dashboard/sync'), ), ], ), const SizedBox(height: 24), // Stats cards Wrap( spacing: 12, runSpacing: 12, children: [ _StatCard(label: 'Nuovi Ordini', value: data.newOrdersCount.toString(), icon: Icons.receipt_long, color: theme.colorScheme.primary), _StatCard(label: 'Ordini in Sospeso', value: data.ordersOnHoldCount.toString(), icon: Icons.pause_circle, color: theme.colorScheme.tertiary), _StatCard(label: 'Nuovi Clienti', value: data.newCustomersCount.toString(), icon: Icons.person_add, color: theme.colorScheme.secondary), ], ), const SizedBox(height: 24), // Top items if (data.topItems.isNotEmpty) ...[ Text('Articoli Più Venduti', style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold)), const SizedBox(height: 8), Card( child: Column( children: data.topItems.map((item) => ListTile( leading: CircleAvatar(child: Text(item.codArticolo?.substring(0, 2) ?? '??')), title: Text(item.descrizione ?? ''), trailing: Text(NumberFormat.currency(locale: 'it', symbol: '€').format(item.totale ?? 0)), )).toList(), ), ), ], // Top customers if (data.topCustomers.isNotEmpty) ...[ const SizedBox(height: 16), Text('Top Clienti', style: theme.textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold)), const SizedBox(height: 8), Card( child: Column( children: data.topCustomers.map((c) => ListTile( leading: CircleAvatar(child: Text(c.codCliente?.substring(0, 2) ?? '??')), title: Text(c.ragioneSociale ?? ''), trailing: Text(NumberFormat.currency(locale: 'it', symbol: '€').format(c.totale ?? 0)), )).toList(), ), ), ], ], ), ); } } class _ActionCard extends StatelessWidget { final IconData icon; final String label; final Color color; final VoidCallback onTap; const _ActionCard({required this.icon, required this.label, required this.color, required this.onTap}); @override Widget build(BuildContext context) { return SizedBox( width: ResponsiveBreakpoints.isPhone(context) ? (MediaQuery.of(context).size.width - 48) / 2 : 160, child: Card( child: InkWell( borderRadius: BorderRadius.circular(12), onTap: onTap, child: Padding( padding: const EdgeInsets.all(16), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon(icon, size: 32, color: color), const SizedBox(height: 8), Text(label, textAlign: TextAlign.center, style: Theme.of(context).textTheme.labelLarge), ], ), ), ), ), ); } } class _StatCard extends StatelessWidget { final String label; final String value; final IconData icon; final Color color; const _StatCard({required this.label, required this.value, required this.icon, required this.color}); @override Widget build(BuildContext context) { return Card( child: Padding( padding: const EdgeInsets.all(16), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon(icon, color: color), const SizedBox(width: 12), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(value, style: Theme.of(context).textTheme.headlineSmall?.copyWith(fontWeight: FontWeight.bold)), Text(label, style: Theme.of(context).textTheme.bodySmall), ], ), ], ), ), ); } }