import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import '../models/supplement.dart'; import '../providers/settings_provider.dart'; import '../providers/simple_sync_provider.dart'; import '../providers/supplement_provider.dart'; import '../services/database_sync_service.dart'; import '../widgets/supplement_card.dart'; import '../widgets/dialogs/take_supplement_dialog.dart'; import 'add_supplement_screen.dart'; import 'archived_supplements_screen.dart'; class SupplementsListScreen extends StatelessWidget { const SupplementsListScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Edit Supplements'), backgroundColor: Theme.of(context).colorScheme.inversePrimary, actions: [ Consumer( builder: (context, syncProvider, child) { if (!syncProvider.isConfigured) { return const SizedBox.shrink(); } return IconButton( icon: syncProvider.isSyncing ? const SizedBox( width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : syncProvider.status == SyncStatus.completed && syncProvider.lastSyncTime != null && DateTime.now().difference(syncProvider.lastSyncTime!).inSeconds < 5 ? const Icon(Icons.check, color: Colors.green) : const Icon(Icons.sync), onPressed: syncProvider.isSyncing ? null : () { syncProvider.syncDatabase(); }, tooltip: syncProvider.isSyncing ? 'Syncing...' : 'Force Sync', ); }, ), IconButton( icon: const Icon(Icons.archive), onPressed: () { Navigator.of(context).push( MaterialPageRoute( builder: (context) => const ArchivedSupplementsScreen(), ), ); }, tooltip: 'Archived Supplements', ), ], ), body: Consumer2( builder: (context, provider, settingsProvider, child) { if (provider.isLoading) { return const Center(child: CircularProgressIndicator()); } if (provider.supplements.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.medication_outlined, size: 64, color: Theme.of(context).colorScheme.onSurfaceVariant, ), const SizedBox(height: 16), Text( 'No supplements added yet', style: TextStyle( fontSize: 18, color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), const SizedBox(height: 8), Text( 'Tap the + button to add your first supplement', style: TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), ], ), ); } return RefreshIndicator( onRefresh: () async { await provider.loadSupplements(); await provider.refreshDailyStatus(); }, child: _buildGroupedSupplementsList(context, provider.supplements, settingsProvider, provider), ); }, ), ); } Widget _buildGroupedSupplementsList(BuildContext context, List supplements, SettingsProvider settingsProvider, SupplementProvider provider) { final groupedSupplements = _groupSupplementsByTimeOfDay(supplements, settingsProvider); return ListView( padding: const EdgeInsets.fromLTRB(16, 16, 16, 80), children: [ if (groupedSupplements['morning']!.isNotEmpty) ...[ _buildSectionHeader('Morning (${settingsProvider.morningRange})', Icons.wb_sunny, Colors.orange, groupedSupplements['morning']!.length), ...groupedSupplements['morning']!.map((supplement) => SupplementCard( supplement: supplement, onTake: () => showTakeSupplementDialog(context, supplement), onEdit: () => _editSupplement(context, supplement), onDelete: () => _deleteSupplement(context, supplement), onArchive: () => _archiveSupplement(context, supplement), onDuplicate: () => context.read().duplicateSupplement(supplement.id!), showCompletionStatus: false, ), ), const SizedBox(height: 16), ], if (groupedSupplements['afternoon']!.isNotEmpty) ...[ _buildSectionHeader('Afternoon (${settingsProvider.afternoonRange})', Icons.light_mode, Colors.blue, groupedSupplements['afternoon']!.length), ...groupedSupplements['afternoon']!.map((supplement) => SupplementCard( supplement: supplement, onTake: () => showTakeSupplementDialog(context, supplement), onEdit: () => _editSupplement(context, supplement), onDelete: () => _deleteSupplement(context, supplement), onArchive: () => _archiveSupplement(context, supplement), onDuplicate: () => context.read().duplicateSupplement(supplement.id!), showCompletionStatus: false, ), ), const SizedBox(height: 16), ], if (groupedSupplements['evening']!.isNotEmpty) ...[ _buildSectionHeader('Evening (${settingsProvider.eveningRange})', Icons.nightlight_round, Colors.indigo, groupedSupplements['evening']!.length), ...groupedSupplements['evening']!.map((supplement) => SupplementCard( supplement: supplement, onTake: () => showTakeSupplementDialog(context, supplement), onEdit: () => _editSupplement(context, supplement), onDelete: () => _deleteSupplement(context, supplement), onArchive: () => _archiveSupplement(context, supplement), onDuplicate: () => context.read().duplicateSupplement(supplement.id!), showCompletionStatus: false, ), ), const SizedBox(height: 16), ], if (groupedSupplements['night']!.isNotEmpty) ...[ _buildSectionHeader('Night (${settingsProvider.nightRange})', Icons.bedtime, Colors.purple, groupedSupplements['night']!.length), ...groupedSupplements['night']!.map((supplement) => SupplementCard( supplement: supplement, onTake: () => showTakeSupplementDialog(context, supplement), onEdit: () => _editSupplement(context, supplement), onDelete: () => _deleteSupplement(context, supplement), onArchive: () => _archiveSupplement(context, supplement), onDuplicate: () => context.read().duplicateSupplement(supplement.id!), showCompletionStatus: false, ), ), const SizedBox(height: 16), ], if (groupedSupplements['anytime']!.isNotEmpty) ...[ _buildSectionHeader('Anytime', Icons.schedule, Colors.grey, groupedSupplements['anytime']!.length), ...groupedSupplements['anytime']!.map((supplement) => SupplementCard( supplement: supplement, onTake: () => showTakeSupplementDialog(context, supplement), onEdit: () => _editSupplement(context, supplement), onDelete: () => _deleteSupplement(context, supplement), onArchive: () => _archiveSupplement(context, supplement), onDuplicate: () => context.read().duplicateSupplement(supplement.id!), showCompletionStatus: false, ), ), ], ], ); } Widget _buildSectionHeader(String title, IconData icon, Color color, int count) { return Container( margin: const EdgeInsets.only(bottom: 12), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), decoration: BoxDecoration( color: color.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(12), border: Border.all( color: color.withValues(alpha: 0.3), width: 1, ), ), child: Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: color.withValues(alpha: 0.2), shape: BoxShape.circle, ), child: Icon( icon, size: 20, color: color, ), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title.contains('(') ? title.split('(')[0].trim() : title, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: color, ), ), if (title.contains('(')) ...[ Text( '(${title.split('(')[1]}', style: TextStyle( fontSize: 12, fontWeight: FontWeight.w500, color: color.withValues(alpha: 0.8), ), ), ], ], ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: color.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(12), ), child: Text( count.toString(), style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: color, ), ), ), ], ), ); } Map> _groupSupplementsByTimeOfDay(List supplements, SettingsProvider settingsProvider) { final Map> grouped = { 'morning': [], 'afternoon': [], 'evening': [], 'night': [], 'anytime': [], }; for (final supplement in supplements) { final category = settingsProvider.determineTimeCategory(supplement.reminderTimes); grouped[category]!.add(supplement); } return grouped; } void _editSupplement(BuildContext context, Supplement supplement) { Navigator.of(context).push( MaterialPageRoute( builder: (context) => AddSupplementScreen(supplement: supplement), ), ); } void _deleteSupplement(BuildContext context, Supplement supplement) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Delete Supplement'), content: Text('Are you sure you want to delete ${supplement.name}?'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Cancel'), ), ElevatedButton( onPressed: () { context.read().deleteSupplement(supplement.id!); Navigator.of(context).pop(); ShadSonner.of(context).show( ShadToast( title: Text('${supplement.name} deleted'), ), ); }, style: ElevatedButton.styleFrom(backgroundColor: Colors.red), child: const Text('Delete'), ), ], ), ); } void _archiveSupplement(BuildContext context, Supplement supplement) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Archive Supplement'), content: Text('Are you sure you want to archive ${supplement.name}? You can unarchive it later from the archived supplements list.'), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: const Text('Cancel'), ), ElevatedButton( onPressed: () { context.read().archiveSupplement(supplement.id!); Navigator.of(context).pop(); ShadSonner.of(context).show( ShadToast( title: Text('${supplement.name} archived'), ), ); }, style: ElevatedButton.styleFrom(backgroundColor: Colors.orange), child: const Text('Archive'), ), ], ), ); } }