/// Die expliziten Phasen des Lieferprozesses nach der Fahrzeugauswahl.
///
/// Die Reihenfolge im Enum entspricht der logischen Tagesabfolge:
///   1. [auswaehlen] (nur bei Teams mit mehreren Fahrzeugen)
///   2. [sortieren]
///   3. [beladen]
///   4. [ausliefern]
///
/// Wichtig: Die Schrittnummer ist NICHT statisch (z. B. "Sortieren = 2"),
/// sondern hängt von der für den Fahrer sichtbaren Phasenmenge ab — bei
/// Ein-Auto-Teams entfällt [auswaehlen] und [sortieren] wird zu Schritt 1.
/// Die Berechnung erfolgt deshalb dynamisch im [PhaseStepper] bzw. in der
/// BLoC-Schicht und nicht auf dem Enum selbst.
///
/// Der Fahrer darf zwischen bereits erreichten Phasen frei zurückspringen
/// — die Phase ist daher kein Zwangs-Stepper, sondern markiert lediglich
/// die aktuelle Bühne des Tages.
enum DeliveryPhase {
  /// Aus den Tour-Lieferungen die eigenen Aufträge auswählen / umladen
  /// (nur bei ≥2 Fahrzeugen im Team relevant).
  auswaehlen,

  /// Reihenfolge der Lieferungen festlegen (Drag & Drop).
  sortieren,

  /// Beladung mit Scan, geführt nach der gewählten Reihenfolge.
  beladen,

  /// Beladung abgeschlossen, Auslieferung läuft.
  ausliefern,
}

extension DeliveryPhaseExtension on DeliveryPhase {
  /// Stabile Schlüssel für die Persistenz. Bewusst entkoppelt von der
  /// enum-Reihenfolge, damit zukünftige Umbenennungen den Disk-State nicht
  /// brechen.
  String get persistenceKey => switch (this) {
        DeliveryPhase.auswaehlen => "auswaehlen",
        DeliveryPhase.sortieren => "sortieren",
        DeliveryPhase.beladen => "beladen",
        DeliveryPhase.ausliefern => "ausliefern",
      };

  /// Anzeigename für die UI (Banner, Stepper).
  String get displayName => switch (this) {
        DeliveryPhase.auswaehlen => "Auswählen",
        DeliveryPhase.sortieren => "Sortieren",
        DeliveryPhase.beladen => "Beladen",
        DeliveryPhase.ausliefern => "Ausliefern",
      };

  /// Schrittnummer (1-basiert) in einer gegebenen Phasen-Sichtbarkeitsliste.
  ///
  /// Dynamische Variante, die [stepNumber] (statisch) ersetzt — der Stepper
  /// erhält je nach Team-Konfiguration eine andere [visiblePhases]-Liste und
  /// bestimmt darüber, welche Nummer hier angezeigt wird.
  ///
  /// Liefert `-1`, wenn die Phase nicht in [visiblePhases] enthalten ist.
  int stepNumberIn(List<DeliveryPhase> visiblePhases) {
    final idx = visiblePhases.indexOf(this);
    return idx == -1 ? -1 : idx + 1;
  }

  static DeliveryPhase? fromPersistenceKey(String? key) {
    if (key == null) return null;
    for (final phase in DeliveryPhase.values) {
      if (phase.persistenceKey == key) return phase;
    }
    return null;
  }

  /// Liefert die für den Fahrer sichtbaren Phasen abhängig von der Anzahl
  /// der Team-Fahrzeuge:
  ///
  /// * 0 oder 1 Auto → [sortieren, beladen, ausliefern]
  /// * ≥2 Autos     → [auswaehlen, sortieren, beladen, ausliefern]
  ///
  /// Single source of truth für Stepper und Banner.
  static List<DeliveryPhase> visiblePhasesForCarCount(int carCount) {
    if (carCount >= 2) {
      return const [
        DeliveryPhase.auswaehlen,
        DeliveryPhase.sortieren,
        DeliveryPhase.beladen,
        DeliveryPhase.ausliefern,
      ];
    }
    return const [
      DeliveryPhase.sortieren,
      DeliveryPhase.beladen,
      DeliveryPhase.ausliefern,
    ];
  }
}
