import 'package:flutter/material.dart'; import 'package:frontend_splatournament_manager/providers/tournament_provider.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; class CreateTournamentPage extends StatefulWidget { const CreateTournamentPage({super.key}); @override State createState() => _CreateTournamentPageState(); } class _CreateTournamentPageState extends State { final _formKey = GlobalKey(); final _nameController = TextEditingController(); final _descriptionController = TextEditingController(); int _maxTeamAmount = 2; DateTime? _startDate; DateTime? _endDate; bool _isLoading = false; final DateFormat _dateFormat = DateFormat('dd.MM.yyyy', 'de_DE'); Future _selectDate(BuildContext context, bool isStart) async { final initialDate = DateTime.now(); final picked = await showDatePicker( context: context, locale: const Locale('de', 'DE'), initialDate: initialDate, firstDate: initialDate, lastDate: DateTime(2101), ); if (picked != null) { setState(() { if (isStart) { _startDate = picked; } else { _endDate = picked; } }); } } void _submitForm() async { if (!_formKey.currentState!.validate()) return; if (_startDate == null || _endDate == null) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text( 'Bitte wähle sowohl ein Start- als auch ein Enddatum aus.', ), ), ); return; } if (_endDate!.isBefore(_startDate!)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Das Enddatum darf nicht vor dem Startdatum liegen.'), ), ); return; } setState(() => _isLoading = true); try { final provider = Provider.of(context, listen: false); await provider.createTournament( _nameController.text, _descriptionController.text, _maxTeamAmount, _startDate!, _endDate!, ); if (!mounted) return; Navigator.pop(context); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( 'Fehler: ${e.toString().replaceFirst('Exception: ', '')}', ), ), ); } finally { if (mounted) setState(() => _isLoading = false); } } @override void dispose() { _nameController.dispose(); _descriptionController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Turnier erstellen')), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextFormField( controller: _nameController, decoration: const InputDecoration(labelText: 'Name'), validator: (value) => value == null || value.isEmpty ? 'Pflichtfeld' : null, ), const SizedBox(height: 16), TextFormField( controller: _descriptionController, decoration: const InputDecoration(labelText: 'Beschreibung'), maxLines: 3, validator: (value) => value == null || value.isEmpty ? 'Pflichtfeld' : null, ), const SizedBox(height: 16), DropdownButtonFormField( initialValue: _maxTeamAmount, decoration: const InputDecoration(labelText: 'Maximale Teams'), items: [2, 4, 8].map((int value) { return DropdownMenuItem( value: value, child: Text(value.toString()), ); }).toList(), onChanged: (int? newValue) { if (newValue != null) { setState(() { _maxTeamAmount = newValue; }); } }, ), const SizedBox(height: 24), Row( children: [ Expanded( child: OutlinedButton( onPressed: () => _selectDate(context, true), child: Text( _startDate == null ? 'Startdatum wählen' : 'Start: ${_dateFormat.format(_startDate!)}', ), ), ), const SizedBox(width: 16), Expanded( child: OutlinedButton( onPressed: () => _selectDate(context, false), child: Text( _endDate == null ? 'Enddatum wählen' : 'Ende: ${_dateFormat.format(_endDate!)}', ), ), ), ], ), const SizedBox(height: 32), ElevatedButton( onPressed: _isLoading ? null : _submitForm, child: _isLoading ? const CircularProgressIndicator() : const Text('Turnier erstellen'), ), ], ), ), ), ); } }