import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/core/widgets/shared_forms/model_section.dart'; import 'package:flux/features/master_data/providers/blocs/provider_cubit.dart'; import 'package:flux/features/operations/blocs/operation_form_cubit.dart'; import 'package:flux/features/operations/models/operation_model.dart'; class DetailsSection extends StatelessWidget { final OperationModel? currentOp; final String currentType; final TextEditingController freeTextSubtypeController; final TextEditingController freeTextDescriptionController; final Widget durationQuickPicks; const DetailsSection({ super.key, required this.currentOp, required this.currentType, required this.freeTextSubtypeController, required this.freeTextDescriptionController, required this.durationQuickPicks, }); bool _doesProviderMatchOperationType(dynamic provider, String operationType) { if (operationType == 'Custom') return true; switch (operationType) { case 'AL': case 'MNP': return provider.mobile == true; case 'NIP': return provider.landline == true; case 'UNICA': return provider.landline == true || provider.mobile == true; case 'Energy': return provider.energy == true; case 'Fin': return provider.financing == true; case 'Entertainment': return provider.entertainment == true; case 'TELEPASS': return provider.telepass == true; default: return true; } } void _showProviderModal(BuildContext context, String operationType) { final OperationFormCubit cubit = context.read(); showModalBottomSheet( context: context, isScrollControlled: true, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), builder: (modalContext) { return DraggableScrollableSheet( initialChildSize: 0.5, minChildSize: 0.4, maxChildSize: 0.8, expand: false, builder: (_, scrollController) { return Column( children: [ Padding( padding: const EdgeInsets.all(16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'Seleziona Gestore', style: Theme.of(context).textTheme.titleLarge, ), IconButton( icon: const Icon(Icons.close), onPressed: () => Navigator.pop(modalContext), ), ], ), ), const Divider(), Expanded( child: BlocBuilder( builder: (context, state) { if (state.isLoading) { return const Center(child: CircularProgressIndicator()); } final allProviders = state.activeProviders; final filteredProviders = allProviders .where( (p) => _doesProviderMatchOperationType( p, operationType, ), ) .toList(); if (filteredProviders.isEmpty) { return const Center( child: Text( 'Nessun gestore compatibile con questo servizio.', style: TextStyle(color: Colors.grey), ), ); } return BlocProvider.value( value: cubit, child: ListView.builder( controller: scrollController, itemCount: filteredProviders.length, itemBuilder: (context, index) { final provider = filteredProviders[index]; return ListTile( leading: const Icon(Icons.business), title: Text( provider.name, style: const TextStyle( fontWeight: FontWeight.bold, ), ), onTap: () { context.read().updateFields( providerId: provider.id, providerDisplayName: provider.name, ); Navigator.pop(modalContext); }, ); }, ), ); }, ), ), ], ); }, ); }, ); } @override Widget build(BuildContext context) { final theme = Theme.of(context); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // PROVIDER (Mostrato quasi sempre) ListTile( title: const Text('Seleziona Gestore'), subtitle: Text( (currentOp?.providerDisplayName != null && currentOp!.providerDisplayName!.isNotEmpty) ? currentOp!.providerDisplayName! : 'Nessun gestore selezionato', style: TextStyle( color: (currentOp?.providerId == null || currentOp!.providerId!.isEmpty) ? Colors.grey : null, fontWeight: (currentOp?.providerId == null || currentOp!.providerId!.isEmpty) ? FontWeight.normal : FontWeight.bold, ), ), trailing: const Icon(Icons.arrow_drop_down), shape: RoundedRectangleBorder( side: BorderSide(color: theme.dividerColor), borderRadius: BorderRadius.circular(8), ), onTap: () => _showProviderModal(context, currentType), ), const SizedBox(height: 16), // 1. SCENARIO ENERGY (Dropdown Fisso) if (currentType == 'Energy') ...[ DropdownButtonFormField( initialValue: (currentOp?.subtype != null && currentOp!.subtype!.isNotEmpty) ? currentOp!.subtype : null, decoration: const InputDecoration(labelText: 'Dettaglio Fornitura'), items: [ 'Luce', 'Gas', ].map((s) => DropdownMenuItem(value: s, child: Text(s))).toList(), onChanged: (val) { if (val != null) { context.read().updateFields(subtype: val); } }, ), const SizedBox(height: 16), TextFormField( controller: freeTextDescriptionController, decoration: InputDecoration( labelText: currentType == 'Energy' ? 'Offerta scelta' : 'Nome del servizio/offerta', ), ), const SizedBox(height: 16), ], // 2. SCENARIO FIN (Ricerca Modello/Prodotto) if (currentType == 'Fin') ...[ SharedModelSection( label: 'Seleziona Dispositivo/Prodotto', modelId: currentOp?.modelId, modelName: currentOp?.modelDisplayName, onModelSelected: (id, name) { context.read().updateFields( modelId: id, modelDisplayName: name, ); }, ), const SizedBox(height: 16), ], // 3. SCENARIO ENTERTAINMENT O CUSTOM (Testo libero) if (currentType == 'Entertainment' || currentType == 'Custom') ...[ TextFormField( controller: freeTextSubtypeController, decoration: InputDecoration( labelText: currentType == 'Entertainment' ? 'Piattaforma (es. Netflix, DAZN, Spotify...)' : 'Specifica il servizio (es. Monopattino)', ), ), const SizedBox(height: 16), ], // SCADENZA (Reattivo per tipi complessi) if ([ 'Energy', 'Fin', 'Entertainment', 'Custom', ].contains(currentType)) ...[ const SizedBox(height: 8), durationQuickPicks, // Passiamo i chips dall'esterno const SizedBox(height: 16), ListTile( title: const Text('Data di Scadenza Effettiva'), subtitle: Text( currentOp?.expirationDate != null ? "${currentOp!.expirationDate!.day}/${currentOp!.expirationDate!.month}/${currentOp!.expirationDate!.year}" : 'Nessuna scadenza impostata', style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), ), trailing: const Icon(Icons.calendar_month, color: Colors.blue), tileColor: Colors.blue.withValues(alpha: 0.05), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: const BorderSide(color: Colors.blue, width: 0.5), ), onTap: () async { final date = await showDatePicker( context: context, initialDate: currentOp?.expirationDate ?? DateTime.now().add(const Duration(days: 365)), firstDate: DateTime.now(), lastDate: DateTime.now().add(const Duration(days: 3650)), ); if (date != null && context.mounted) { context.read().updateFields( expirationDate: date, ); } }, ), const SizedBox(height: 16), ], ], ); } }