getGroupedFailedRequests method

Future<List<GroupedInspection>> getGroupedFailedRequests()

Gruppiert die fehlgeschlagenen Requests nach PJNr

Implementation

Future<List<GroupedInspection>> getGroupedFailedRequests() async {
  debugPrint('getGroupedFailedRequests: Starte...');
  final failedReqs = await API().local.getAllFailedRequests() ?? [];
  debugPrint('getGroupedFailedRequests: ${failedReqs.length} fehlgeschlagene Requests gefunden');

  Map<String, Map<String, dynamic>> groupedRequests = {};

  for (var (id, requestData) in failedReqs) {
    try {
      if (requestData != null) {
        final jsonData = requestData.json;
        if (jsonData != null) {
          final data = jsonData['data'];
          Map<String, dynamic> parsedData;

          if (data is String) {
            parsedData = Map<String, dynamic>.from(json.decode(data));
          } else {
            parsedData = Map<String, dynamic>.from(data);
          }

          final pjNr = parsedData['PjNr']?.toString() ?? 'Unbekannt';
          final route = requestData.route;
          final timestamp = DateTime.fromMillisecondsSinceEpoch(int.parse(id, radix: 36));

          if (!groupedRequests.containsKey(pjNr)) {
            groupedRequests[pjNr] = {
              'requests': <String>[],
              'total': 0,
              'completed': 0,
              'progress': 0.0,
              'requestTypes': <String, int>{},
              'totalSize': 0, // Set to 0 or skip for large batches
              'lastModified': timestamp,
            };
          }

          // Aktualisiere die Map mit den Request-Informationen
          final group = groupedRequests[pjNr]!;
          (group['requests'] as List<String>).add(route);
          group['total'] = (group['total'] as int) + 1;

          // Zähle die Request-Typen
          final requestType = route.split('/').first;
          group['requestTypes'][requestType] =
              (group['requestTypes'][requestType] ?? 0) + 1;

          // Do NOT serialize the full request, just estimate or skip size
          // group['totalSize'] = (group['totalSize'] as int) + 0;

          // Aktualisiere den Zeitstempel der letzten Änderung
          if (timestamp.isAfter(group['lastModified'] as DateTime)) {
            group['lastModified'] = timestamp;
          }

          if (parsedData['offline'] == false) {
            group['completed'] = (group['completed'] as int) + 1;
          }
        }
      }
    } catch (e) {
      debugPrint('Error parsing request: $e');
    }
  }

  debugPrint('getGroupedFailedRequests: ${groupedRequests.length} verschiedene Inspektionen gefunden');

  // Berechne den Fortschritt für jede Inspektion
  for (var pjNr in groupedRequests.keys) {
    final total = groupedRequests[pjNr]!['total'] as int;
    final completed = groupedRequests[pjNr]!['completed'] as int;
    groupedRequests[pjNr]!['progress'] = total > 0 ? completed / total : 0.0;
  }

  // Konvertiere die Map in eine Liste von GroupedInspection Objekten
  final result = groupedRequests.entries
      .map((entry) => GroupedInspection(
            pjNr: entry.key,
            requests: List<String>.from(entry.value['requests'] as List),
            total: entry.value['total'] as int,
            completed: entry.value['completed'] as int,
            progress: entry.value['progress'] as double,
            requestTypes:
                Map<String, int>.from(entry.value['requestTypes'] as Map),
            totalSize: entry.value['totalSize'] as int,
            lastModified: entry.value['lastModified'] as DateTime,
          ))
      .toList();

  debugPrint('getGroupedFailedRequests: Fertig. ${result.length} Inspektionen zurückgegeben');
  return result;
}