import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; class ProfileTab extends StatefulWidget { final VoidCallback? onLogoutSuccess; const ProfileTab({super.key, this.onLogoutSuccess}); @override State createState() => _ProfileTabState(); } class _ProfileTabState extends State { final _formKey = GlobalKey(); bool _isTrainer = false; bool _isLoading = false; Map _trainingTimes = {}; Map _trainingDurations = {}; @override void initState() { super.initState(); _loadUserData(); } Future _loadUserData() async { final user = FirebaseAuth.instance.currentUser; if (user == null) return; try { final doc = await FirebaseFirestore.instance.collection('User').doc(user.uid).get(); if (doc.exists) { final data = doc.data()!; setState(() { _isTrainer = data['role'] == 'trainer'; if (_isTrainer) { _trainingTimes = Map.from( (data['trainingTimes'] ?? {}).map( (key, value) => MapEntry( key, TimeOfDay( hour: int.parse(value.split(':')[0]), minute: int.parse(value.split(':')[1]), ), ), ), ); _trainingDurations = Map.from(data['trainingDurations'] ?? {}); } }); } } catch (e) { print('Error loading user data: $e'); } } Future _saveTrainingTime(String day, TimeOfDay? time, int? duration) async { if (time == null || duration == null) return; setState(() => _isLoading = true); try { final user = FirebaseAuth.instance.currentUser; if (user == null) return; final timeString = '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}'; await FirebaseFirestore.instance.collection('User').doc(user.uid).update({ 'trainingTimes.$day': timeString, 'trainingDurations.$day': duration, }); setState(() { _trainingTimes[day] = time; _trainingDurations[day] = duration; }); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Trainingszeit gespeichert')), ); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Fehler beim Speichern: $e')), ); } finally { setState(() => _isLoading = false); } } Future _removeTrainingTime(String day) async { setState(() => _isLoading = true); try { final user = FirebaseAuth.instance.currentUser; if (user == null) return; await FirebaseFirestore.instance.collection('User').doc(user.uid).update({ 'trainingTimes.$day': FieldValue.delete(), 'trainingDurations.$day': FieldValue.delete(), }); setState(() { _trainingTimes.remove(day); _trainingDurations.remove(day); }); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Trainingszeit entfernt')), ); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Fehler beim Entfernen: $e')), ); } finally { setState(() => _isLoading = false); } } Future _selectTime(BuildContext context, String day) async { final TimeOfDay? picked = await showTimePicker( context: context, initialTime: _trainingTimes[day] ?? TimeOfDay.now(), ); if (picked != null) { final duration = await showDialog( context: context, builder: (context) => _DurationDialog( initialDuration: _trainingDurations[day] ?? 60, ), ); if (duration != null) { await _saveTrainingTime(day, picked, duration); } } } @override Widget build(BuildContext context) { final user = FirebaseAuth.instance.currentUser; if (user == null) { return const Center(child: Text('Nicht eingeloggt')); } return Scaffold( appBar: AppBar( title: const Text('Profil'), actions: [ IconButton( icon: const Icon(Icons.logout), onPressed: () async { await FirebaseAuth.instance.signOut(); if (widget.onLogoutSuccess != null) { widget.onLogoutSuccess!(); } }, ), ], ), body: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Persönliche Informationen', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 16), FutureBuilder( future: FirebaseFirestore.instance.collection('User').doc(user.uid).get(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } if (!snapshot.hasData || !snapshot.data!.exists) { return const Center(child: Text('Keine Daten gefunden')); } final data = snapshot.data!.data() as Map; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Name: ${data['name'] ?? '-'}'), const SizedBox(height: 8), Text('E-Mail: ${user.email ?? '-'}'), const SizedBox(height: 8), Text('Rolle: ${data['role'] ?? '-'}'), if (_isTrainer) ...[ const SizedBox(height: 24), const Text( 'Trainingszeiten', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 16), ...['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] .map((day) => Card( margin: const EdgeInsets.only(bottom: 8), child: ListTile( title: Text(day), subtitle: _trainingTimes[day] != null ? Text( '${_trainingTimes[day]!.format(context)} - ${_trainingDurations[day]} Minuten', ) : const Text('Keine Trainingszeit'), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: Icon( _trainingTimes[day] != null ? Icons.edit : Icons.add, ), onPressed: _isLoading ? null : () => _selectTime(context, day), ), if (_trainingTimes[day] != null) IconButton( icon: const Icon(Icons.delete), onPressed: _isLoading ? null : () => _removeTrainingTime(day), ), ], ), ), )) .toList(), ], ], ); }, ), ], ), ), ); } } class _DurationDialog extends StatefulWidget { final int initialDuration; const _DurationDialog({required this.initialDuration}); @override State<_DurationDialog> createState() => _DurationDialogState(); } class _DurationDialogState extends State<_DurationDialog> { late int _duration; @override void initState() { super.initState(); _duration = widget.initialDuration; } @override Widget build(BuildContext context) { return AlertDialog( title: const Text('Trainingsdauer'), content: Column( mainAxisSize: MainAxisSize.min, children: [ const Text('Wähle die Dauer der Trainingseinheit in Minuten:'), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton( icon: const Icon(Icons.remove), onPressed: () { if (_duration > 15) { setState(() => _duration -= 15); } }, ), Text( '$_duration Minuten', style: const TextStyle(fontSize: 18), ), IconButton( icon: const Icon(Icons.add), onPressed: () { setState(() => _duration += 15); }, ), ], ), ], ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('Abbrechen'), ), ElevatedButton( onPressed: () => Navigator.pop(context, _duration), child: const Text('Bestätigen'), ), ], ); } }