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 '../../../brackets/domain/bracket.dart'; import '../../application/admin_brackets_notifier.dart'; class AdminBracketsScreen extends ConsumerWidget { const AdminBracketsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final bracketsAsync = ref.watch(adminBracketsStreamProvider); final theme = Theme.of(context); return Scaffold( body: bracketsAsync.when( loading: () => const Center(child: CircularProgressIndicator()), error: (err, _) => Center( child: Padding( padding: const EdgeInsets.all(32), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.error_outline, size: 48, color: theme.colorScheme.error, ), const SizedBox(height: 12), Text( 'Could not load brackets', style: theme.textTheme.titleMedium, ), const SizedBox(height: 6), Text( '$err', textAlign: TextAlign.center, style: theme.textTheme.bodySmall?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), ), ], ), ), ), data: (brackets) { if (brackets.isEmpty) { return Center( child: Padding( padding: const EdgeInsets.all(32), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.account_tree_outlined, size: 64, color: theme.colorScheme.onSurfaceVariant, ), const SizedBox(height: 16), Text( 'No brackets yet', style: theme.textTheme.titleMedium, ), const SizedBox(height: 8), Text( 'Tap the + button to create your first bracket.', style: theme.textTheme.bodyMedium?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), ), ], ), ), ); } return ListView.builder( padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), itemCount: brackets.length, itemBuilder: (context, i) => _BracketRow(bracket: brackets[i]), ); }, ), floatingActionButton: FloatingActionButton.extended( onPressed: () => context.go('/admin/brackets/new'), icon: const Icon(Icons.add), label: const Text('NEW BRACKET'), ), ); } } class _BracketRow extends ConsumerWidget { const _BracketRow({required this.bracket}); final Bracket bracket; Future _confirmDelete(BuildContext context, WidgetRef ref) async { final confirmed = await showDialog( context: context, builder: (ctx) => AlertDialog( title: const Text('Delete bracket?'), content: Text( '"${bracket.name}" and all its match data will be permanently removed.', ), actions: [ TextButton( onPressed: () => Navigator.of(ctx).pop(false), child: const Text('Cancel'), ), FilledButton.tonal( onPressed: () => Navigator.of(ctx).pop(true), child: const Text('Delete'), ), ], ), ); if (confirmed != true) return; if (!context.mounted) return; try { await ref.read(adminBracketsNotifierProvider.notifier).delete(bracket.id); if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Deleted "${bracket.name}"')), ); } } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Delete failed: $e')), ); } } } @override Widget build(BuildContext context, WidgetRef ref) { final theme = Theme.of(context); final created = DateFormat.yMMMd().format(bracket.createdAt); final totalMatches = bracket.rounds.fold( 0, (sum, r) => sum + r.matches.length, ); return Card( margin: const EdgeInsets.symmetric(vertical: 6), child: Padding( padding: const EdgeInsets.all(14), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(bracket.name, style: theme.textTheme.titleMedium), const SizedBox(height: 6), Text( '${bracket.rounds.length} round${bracket.rounds.length == 1 ? '' : 's'} · $totalMatches match${totalMatches == 1 ? '' : 'es'} · Created $created', style: theme.textTheme.bodySmall?.copyWith( color: theme.colorScheme.onSurfaceVariant, ), ), const SizedBox(height: 12), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton.icon( onPressed: () => _confirmDelete(context, ref), icon: const Icon(Icons.delete_outline, size: 18), label: const Text('Delete'), ), const SizedBox(width: 8), OutlinedButton.icon( onPressed: () => context.go('/admin/brackets/${bracket.id}/edit'), icon: const Icon(Icons.edit_outlined, size: 18), label: const Text('Edit'), ), ], ), ], ), ), ); } }