import 'package:hl_lieferservice/feature/delivery/bloc/tour_state.dart'; import 'package:hl_lieferservice/model/delivery.dart'; /// Hilfen rund um die Belade-Reihenfolge. /// /// Die Beladereihenfolge ist die *Umkehrung* der vom Fahrer bestätigten /// Auslieferungs-Reihenfolge (Sortier-Phase): wer zuletzt ausgeliefert wird, /// kommt zuerst auf den LKW und liegt hinten. Diese Klasse liefert die /// gefilterte und gespiegelte ID-Liste — Quelle ist immer /// `TourLoaded.sortingInformation[carId]`. /// /// Filterung: /// * Bei ≥2 Fahrzeugen im Team: nur Lieferungen mit /// `delivery.carId == selectedCarId`. /// * Bei genau 1 Fahrzeug: alle Tour-Lieferungen. /// /// Konsistent mit der bestehenden Logik in [DeliverySortPage] und der /// alten `scan_page.dart:792`. class LoadingOrder { const LoadingOrder._(); /// Berechnet die Belade-Reihenfolge an Delivery-IDs. /// /// [carIdStr] ist das String-Pendant der gewählten Auto-ID, weil die /// `sortingInformation` mit String-Keys arbeitet. static List computeForCar({ required TourLoaded state, required String carIdStr, }) { final cars = state.tour.driver.cars; final allowedIds = cars.length >= 2 ? state.tour.deliveries .where((d) => d.carId?.toString() == carIdStr) .map((d) => d.id) .toSet() : state.tour.deliveries.map((d) => d.id).toSet(); final raw = state.sortingInformation[carIdStr] ?? const []; // Mit reversed nach hinten kommt die zuletzt ausgelieferte Lieferung // nach vorne (zuerst beladen). final reversed = raw.reversed.where(allowedIds.contains).toList(); // Falls die Sortierung leer ist (kann bei frisch geladener Tour // vorkommen, bevor `EnsureSortingForCarEvent` durchlief), fallen wir // auf die unsortierten Tour-IDs zurück — der Fahrer sieht so wenigstens // alle Kunden, ohne dass die Page hängt. if (reversed.isEmpty && allowedIds.isNotEmpty) { return allowedIds.toList(growable: false); } return reversed; } /// Komfort-Variante, die zusätzlich abgeschlossene Lieferungen rausfiltert /// (für Anzeigen, die nur "noch zu beladen" bzw. aktive Einträge möchten). static List computeActive({ required TourLoaded state, required String carIdStr, }) { final order = computeForCar(state: state, carIdStr: carIdStr); final byId = {for (final d in state.tour.deliveries) d.id: d}; return order.where((id) { final d = byId[id]; if (d == null) return false; return d.state != DeliveryState.finished; }).toList(growable: false); } }