// lib/screens/main_screen.dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../services/api_service.dart'; import '../services/session_manager.dart'; import '../models/profile.dart'; import '../models/group.dart'; import 'profile_detail_screen.dart'; import 'profile_edit_screen.dart'; import 'group_manager_screen.dart'; import 'time_series_screen.dart'; class MainScreen extends StatefulWidget { const MainScreen({super.key}); @override State createState() => _MainScreenState(); } class _MainScreenState extends State { List _profiles = []; List _filteredProfiles = []; List _groups = []; bool _isLoading = true; String _searchQuery = ''; Group? _selectedGroup; @override void initState() { super.initState(); _loadData(); } Future _loadData() async { setState(() => _isLoading = true); try { final apiService = Provider.of(context, listen: false); final profiles = await apiService.getProfiles(); final groups = await apiService.getGroups(); setState(() { _profiles = profiles; _groups = groups; _applyFilters(); }); } catch (e) { _showError('Daten konnten nicht geladen werden: $e'); } finally { setState(() => _isLoading = false); } } void _applyFilters() { var filtered = List.from(_profiles); if (_searchQuery.isNotEmpty) { filtered = filtered.where((p) => p.name.toLowerCase().contains(_searchQuery.toLowerCase()) || (p.gruppename?.toLowerCase().contains(_searchQuery.toLowerCase()) ?? false) ).toList(); } if (_selectedGroup != null) { filtered = filtered.where((p) => p.gruppename == _selectedGroup!.name).toList(); } setState(() => _filteredProfiles = filtered); } void _showError(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message), backgroundColor: Colors.red), ); } Future _deleteProfile(Profile profile) async { final confirm = await showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Profil löschen'), content: Text('Möchten Sie "${profile.name}" wirklich löschen?'), actions: [ TextButton(onPressed: () => Navigator.pop(context, false), child: const Text('Abbrechen')), TextButton(onPressed: () => Navigator.pop(context, true), child: const Text('Löschen')), ], ), ); if (confirm == true) { try { final apiService = Provider.of(context, listen: false); final success = await apiService.deleteProfile(profile.profilID); if (success) { await _loadData(); } else { _showError('Löschen fehlgeschlagen'); } } catch (e) { _showError('Fehler: $e'); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('DÜSK'), actions: [ IconButton( icon: const Icon(Icons.group), onPressed: () async { await Navigator.push( context, MaterialPageRoute(builder: (_) => const GroupManagerScreen()), ); _loadData(); }, ), IconButton( icon: const Icon(Icons.logout), onPressed: () { Provider.of(context, listen: false).clear(); Navigator.pushReplacementNamed(context, '/login'); }, ), ], ), body: Column( children: [ // Search Bar Padding( padding: const EdgeInsets.all(16), child: TextField( decoration: InputDecoration( hintText: 'Suchen...', prefixIcon: const Icon(Icons.search), border: OutlineInputBorder(borderRadius: BorderRadius.circular(8)), suffixIcon: _searchQuery.isNotEmpty ? IconButton( icon: const Icon(Icons.clear), onPressed: () { setState(() { _searchQuery = ''; _applyFilters(); }); }, ) : null, ), onChanged: (value) { setState(() { _searchQuery = value; _applyFilters(); }); }, ), ), // Group Filter SizedBox( height: 50, child: ListView( scrollDirection: Axis.horizontal, padding: const EdgeInsets.symmetric(horizontal: 16), children: [ FilterChip( label: const Text('Alle'), selected: _selectedGroup == null, onSelected: (_) => setState(() { _selectedGroup = null; _applyFilters(); }), ), const SizedBox(width: 8), ..._groups.map((group) => Padding( padding: const EdgeInsets.only(right: 8), child: FilterChip( label: Text(group.name), selected: _selectedGroup?.gruppeID == group.gruppeID, onSelected: (_) => setState(() { _selectedGroup = _selectedGroup?.gruppeID == group.gruppeID ? null : group; _applyFilters(); }), ), )), ], ), ), // Profile List Expanded( child: _isLoading ? const Center(child: CircularProgressIndicator()) : _filteredProfiles.isEmpty ? const Center(child: Text('Keine Profile gefunden')) : ListView.builder( itemCount: _filteredProfiles.length, itemBuilder: (context, index) { final profile = _filteredProfiles[index]; return Card( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), child: ListTile( title: Text(profile.name), subtitle: Text(profile.gruppename ?? 'Keine Gruppe'), trailing: Text(profile.profilID), onTap: () => Navigator.push( context, MaterialPageRoute( builder: (_) => ProfileDetailScreen(profile: profile), ), ), onLongPress: () => showModalBottomSheet( context: context, builder: (context) => SafeArea( child: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( leading: const Icon(Icons.edit), title: const Text('Bearbeiten'), onTap: () { Navigator.pop(context); Navigator.push( context, MaterialPageRoute( builder: (_) => ProfileEditScreen(profile: profile), ), ).then((_) => _loadData()); }, ), ListTile( leading: const Icon(Icons.delete, color: Colors.red), title: const Text('Löschen'), onTap: () { Navigator.pop(context); _deleteProfile(profile); }, ), ], ), ), ), ), ); }, ), ), ], ), floatingActionButton: FloatingActionButton( onPressed: () async { await Navigator.push( context, MaterialPageRoute(builder: (_) => const ProfileEditScreen()), ); _loadData(); }, child: const Icon(Icons.add), ), ); } }