// lib/screens/time_series_screen.dart import 'package:flutter/material.dart'; import 'package:fl_chart/fl_chart.dart'; import '../services/api_service.dart'; import '../services/calculator.dart'; import '../models/profile.dart'; import '../models/norms.dart'; class TimeSeriesScreen extends StatefulWidget { final String? groupName; final int? groupId; const TimeSeriesScreen({super.key, this.groupName, this.groupId}); @override State createState() => _TimeSeriesScreenState(); } class _TimeSeriesScreenState extends State { List _profiles = []; List> _competenceValues = []; List _profileNames = []; int _selectedCompetence = 0; bool _isLoading = true; @override void initState() { super.initState(); _loadData(); } Future _loadData() async { setState(() => _isLoading = true); try { final apiService = ApiService(); final allProfiles = await apiService.getProfiles(); List filtered; if (widget.groupId != null) { filtered = allProfiles.where((p) => p.gruppeID == widget.groupId.toString()).toList(); } else if (widget.groupName != null) { filtered = allProfiles.where((p) => p.gruppename == widget.groupName).toList(); } else { filtered = allProfiles; } filtered.sort((a, b) => (a.createdAt ?? DateTime.now()).compareTo(b.createdAt ?? DateTime.now())); final values = >[]; final names = []; for (final profile in filtered) { final seSums = Calculator.calculateSums(profile.seItems); final competenceValues = Calculator.calculateProfileValues(seSums, Norms.normSE_HS); values.add(competenceValues); names.add(profile.name); } setState(() { _profiles = filtered; _competenceValues = values; _profileNames = names; _isLoading = false; }); } catch (e) { setState(() => _isLoading = false); _showError('Daten konnten nicht geladen werden'); } } void _showError(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message), backgroundColor: Colors.red), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Zeitreihe - ${widget.groupName ?? 'Alle Profile'}'), ), body: _isLoading ? const Center(child: CircularProgressIndicator()) : _profiles.isEmpty ? const Center(child: Text('Keine Profile in dieser Gruppe')) : Column( children: [ Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('Kompetenz auswählen:', style: TextStyle(fontWeight: FontWeight.bold)), const SizedBox(height: 8), DropdownButton( value: _selectedCompetence, isExpanded: true, items: List.generate(6, (i) { return DropdownMenuItem( value: i, child: Text(Norms.kompetenzen[i]), ); }), onChanged: (value) => setState(() => _selectedCompetence = value!), ), ], ), ), SizedBox( height: 280, child: Padding( padding: const EdgeInsets.all(16), child: LineChart( LineChartData( gridData: const FlGridData(show: true), titlesData: const FlTitlesData( leftTitles: AxisTitles(sideTitles: SideTitles(showTitles: true)), bottomTitles: AxisTitles(sideTitles: SideTitles(showTitles: false)), ), borderData: FlBorderData(show: true), lineBarsData: [ LineChartBarData( spots: List.generate( _competenceValues.length, (i) => FlSpot(i.toDouble(), _competenceValues[i][_selectedCompetence].toDouble()), ), isCurved: true, color: Colors.blue, barWidth: 2, dotData: const FlDotData(show: true), ), ], minY: 0, maxY: 6, ), ), ), ), const SizedBox(height: 16), const Divider(), Expanded( child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: DataTable( columnSpacing: 12, columns: [ const DataColumn(label: Text('Profil')), ...Norms.kompetenzen.map((k) => DataColumn(label: Text(k.substring(0, 8)))), ], rows: List.generate(_profileNames.length, (index) { return DataRow(cells: [ DataCell(Text(_profileNames[index])), ..._competenceValues[index].map((v) => DataCell(Text(v.toString()))), ]); }), ), ), ), ], ), ); } }