/// Status der Scan-Pipeline eines einzelnen `DeliveryItem`.
///
/// - `inProgress`: Soll-Menge noch nicht erreicht, Scanner darf weiterzählen.
/// - `done`: Soll-Menge erreicht; weitere Scans werden serverseitig abgewiesen.
/// - `held`: Pausiert (z. B. „Ware beschädigt, klärt der Fahrer mit dem Lager") —
///           `ScanProgress.heldReason` trägt die Begründung.
/// - `removed`: Item wurde nach dem Laden wieder abgebucht (Retoure, Falschladung).
enum ScanStatus { inProgress, done, held, removed }

/// Embedded Value-Object am `DeliveryItem`. Beschreibt, wie weit der Fahrer
/// mit dem Scannen dieses Items ist — *nicht*, wo das Item logistisch steht.
class ScanProgress {
  const ScanProgress({
    required this.status,
    required this.scannedQuantity,
    required this.lastUpdatedAt,
    this.creditedQuantity = 0,
    this.heldReason,
  });

  final ScanStatus status;
  final int scannedQuantity;

  /// Als Gutschrift entfernte Menge (0..=requiredQuantity). Eigene Dimension
  /// neben [scannedQuantity]: „wie viele Stück dieser Zeile hat der Kunde
  /// nicht angenommen". `status == removed` entspricht voller Gutschrift
  /// (creditedQuantity == requiredQuantity).
  final int creditedQuantity;

  final DateTime lastUpdatedAt;
  final String? heldReason;

  ScanProgress copyWith({
    ScanStatus? status,
    int? scannedQuantity,
    int? creditedQuantity,
    DateTime? lastUpdatedAt,
    String? heldReason,
  }) {
    return ScanProgress(
      status: status ?? this.status,
      scannedQuantity: scannedQuantity ?? this.scannedQuantity,
      creditedQuantity: creditedQuantity ?? this.creditedQuantity,
      lastUpdatedAt: lastUpdatedAt ?? this.lastUpdatedAt,
      heldReason: heldReason ?? this.heldReason,
    );
  }
}
