import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:ristoris/core/credit_score_color.dart'; import 'package:ristoris/database/database.dart'; import 'package:ristoris/providers/database_provider.dart'; import '../../widgets/search_bar.dart' as sw; import '../../widgets/empty_state.dart'; class SelezioneClientePage extends ConsumerStatefulWidget { final int idAgente; const SelezioneClientePage({super.key, required this.idAgente}); @override ConsumerState createState() => _SelezioneClientePageState(); } class _SelezioneClientePageState extends ConsumerState { String _filter = ''; final _searchCtrl = TextEditingController(); @override void dispose() { _searchCtrl.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final clientiAsync = ref.watch( _filter.isEmpty ? customerListForAgentProvider(widget.idAgente) : customerSearchForAgentProvider(( idAgente: widget.idAgente, filter: _filter, )), ); return Scaffold( appBar: AppBar(title: const Text('Seleziona Cliente')), body: SafeArea( child: Column( children: [ sw.SearchBarWidget( controller: _searchCtrl, hint: 'Cerca per codice, ragione sociale o partita IVA...', onChanged: (v) => setState(() => _filter = v), onClear: () { _searchCtrl.clear(); setState(() => _filter = ''); }, ), Expanded( child: clientiAsync.when( data: (clienti) { if (clienti.isEmpty) { return const EmptyState( icon: Icons.people_outline, title: 'Nessun cliente trovato', ); } return ListView.builder( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), itemCount: clienti.length, itemBuilder: (_, i) => _ClienteTile( cliente: clienti[i], onTap: () => _onClienteTap(clienti[i]), ), ); }, loading: () => const Center(child: CircularProgressIndicator()), error: (e, _) => Center(child: Text('Errore: $e')), ), ), ], ), ), ); } void _onClienteTap(Cliente cliente) { if (cliente.codBlocco == '001') { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Cliente bloccato: impossibile selezionare')), ); return; } Navigator.pop(context, cliente); } } class _ClienteTile extends StatelessWidget { final Cliente cliente; final VoidCallback onTap; const _ClienteTile({required this.cliente, required this.onTap}); @override Widget build(BuildContext context) { final theme = Theme.of(context); final cs = theme.colorScheme; final bgColor = creditScoreBg(cliente.creditScoreColor); return Card( margin: const EdgeInsets.only(bottom: 8), elevation: 0, color: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: BorderSide(color: cs.outlineVariant), ), child: InkWell( borderRadius: BorderRadius.circular(12), onTap: onTap, child: Padding( padding: const EdgeInsets.all(12), child: Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ if ((cliente.codCliente ?? '').isNotEmpty) Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4), decoration: BoxDecoration( color: bgColor ?? cs.surfaceContainerHighest, borderRadius: BorderRadius.circular(4), ), child: Text( cliente.codCliente ?? '', style: TextStyle( fontSize: 12, height: 16 / 12, fontWeight: FontWeight.w500, color: bgColor != null ? Colors.white : cs.onSurfaceVariant, ), ), ), const SizedBox(width: 8), Expanded( child: Text( cliente.ragioneSociale ?? '', style: theme.textTheme.bodyMedium ?.copyWith(fontWeight: FontWeight.w600), maxLines: 1, overflow: TextOverflow.ellipsis, ), ), ], ), const SizedBox(height: 4), Row( children: [ if ((cliente.telefono ?? '').isNotEmpty) ...[ Icon(Icons.phone, size: 14, color: cs.onSurfaceVariant), const SizedBox(width: 4), Text(cliente.telefono ?? '', style: theme.textTheme.bodySmall ?.copyWith(color: cs.onSurfaceVariant)), const SizedBox(width: 12), ], if ((cliente.cellulare ?? '').isNotEmpty) ...[ Icon(Icons.smartphone, size: 14, color: cs.onSurfaceVariant), const SizedBox(width: 4), Text(cliente.cellulare ?? '', style: theme.textTheme.bodySmall ?.copyWith(color: cs.onSurfaceVariant)), ], ], ), ], ), ), if (cliente.codBlocco == '001') Icon(Icons.block, color: Colors.red, size: 24) else if (cliente.codBlocco != null && cliente.codBlocco!.isNotEmpty) Icon(Icons.warning_amber_rounded, color: Colors.amber, size: 24), ], ), ), ), ); } } final customerListForAgentProvider = FutureProvider.family, int>((ref, idAgente) { return ref.read(clientiDaoProvider).getActiveClients(idAgente); }); final customerSearchForAgentProvider = FutureProvider.family, ({int idAgente, String filter})>( (ref, params) { return ref .read(clientiDaoProvider) .getClienti(params.idAgente, params.filter); }, );