import 'package:hl_lieferservice/feature/delivery/model/delivery_phase.dart'; abstract class PhaseState {} class PhaseInitial extends PhaseState {} /// Die aktive Phase pro Fahrzeug. Die Map ist pro Auto-ID separiert, /// weil zwei Lieferketten am selben Tag (selten, aber möglich) parallel /// laufen könnten und sich gegenseitig nicht überschreiben dürfen. /// /// Zusätzlich wird die **höchste je heute erreichte Phase** pro Fahrzeug /// gehalten ([maxPhaseByCar]). Damit kann der Stepper Vorwärts-Sprünge /// auf bereits besuchte Phasen erlauben, auch wenn der Fahrer vorher /// zurückgesprungen ist. class PhaseReady extends PhaseState { final Map phaseByCar; final Map maxPhaseByCar; PhaseReady({ required this.phaseByCar, this.maxPhaseByCar = const {}, }); DeliveryPhase? phaseFor(String carId) => phaseByCar[carId]; /// Höchste am Tag erreichte Phase für [carId]. Fallback: aktuelle Phase /// — wenn nichts gemerkt ist, gilt die aktuelle Phase als "höchste". DeliveryPhase? maxPhaseFor(String carId) => maxPhaseByCar[carId] ?? phaseByCar[carId]; /// Setzt eine neue Phase und bumpt das Max-Tracking, falls die neue Phase /// in der Enum-Reihenfolge höher ist als das bisherige Max. PhaseReady withPhase(String carId, DeliveryPhase phase) { final next = Map.from(phaseByCar); next[carId] = phase; final nextMax = Map.from(maxPhaseByCar); final currentMax = nextMax[carId]; if (currentMax == null || phase.index > currentMax.index) { nextMax[carId] = phase; } return PhaseReady(phaseByCar: next, maxPhaseByCar: nextMax); } /// Wird nach dem Laden aus dem [PhaseService] verwendet, damit die echte /// historische Max-Phase übernommen wird (nicht automatisch geboostet). PhaseReady withLoaded( String carId, DeliveryPhase phase, DeliveryPhase maxPhase, ) { final next = Map.from(phaseByCar); next[carId] = phase; final nextMax = Map.from(maxPhaseByCar); nextMax[carId] = maxPhase; return PhaseReady(phaseByCar: next, maxPhaseByCar: nextMax); } }