import 'package:image_picker/image_picker.dart';

/// Die 5 Steps der Auslieferungs-Detail-Page. Reihenfolge ≙ Index.
enum WorkflowStep {
  info,
  notes,
  articles,
  services,
  summary,
}

extension WorkflowStepX on WorkflowStep {
  String get displayName => switch (this) {
        WorkflowStep.info => 'Info',
        WorkflowStep.notes => 'Notizen',
        WorkflowStep.articles => 'Artikel & Gutschriften',
        WorkflowStep.services => 'Checkliste',
        WorkflowStep.summary => 'Übersicht',
      };

  /// Kurze Bezeichnung für den Header-Step (Platz ist eng auf Mobilgeräten).
  String get shortName => switch (this) {
        WorkflowStep.info => 'Info',
        WorkflowStep.notes => 'Notizen',
        WorkflowStep.articles => 'Artikel',
        WorkflowStep.services => 'Checkliste',
        WorkflowStep.summary => 'Übersicht',
      };
}

/// Eine im Workflow geparkte Bild-Notiz, die noch nicht hochgeladen werden
/// kann — wartet auf den Foto-Upload-Endpoint.
class PendingImageNote {
  const PendingImageNote({required this.file, required this.pickedAt});

  /// Das vom `image_picker` zurückgegebene File-Handle.
  final XFile file;
  final DateTime pickedAt;
}

/// State des Detail-Workflows. Ein State, ein Bloc — der Step-Wechsel,
/// die Drafts und die Payment-Auswahl liegen alle hier. So sieht jede
/// Step-Page denselben kohärenten Zustand und ein Step kann Daten aus
/// einem anderen lesen (z. B. Summary liest Article-Drafts).
class DeliveryWorkflowState {
  const DeliveryWorkflowState({
    required this.deliveryId,
    required this.step,
    required this.pendingImageNotes,
    required this.paymentMethodOverrideId,
  });

  factory DeliveryWorkflowState.initial(String deliveryId) =>
      DeliveryWorkflowState(
        deliveryId: deliveryId,
        step: WorkflowStep.info,
        pendingImageNotes: const [],
        paymentMethodOverrideId: null,
      );

  final String deliveryId;
  final WorkflowStep step;

  /// Lokal gehaltene Bild-Notizen — solange kein Upload-Endpoint da ist.
  final List<PendingImageNote> pendingImageNotes;

  /// Wenn der Fahrer im Summary die Zahlungsmethode überschreibt, landet
  /// die neue Id hier. `null` = Methode der Lieferung bleibt.
  final String? paymentMethodOverrideId;

  DeliveryWorkflowState copyWith({
    WorkflowStep? step,
    List<PendingImageNote>? pendingImageNotes,
    Object? paymentMethodOverrideId = _sentinel,
  }) {
    return DeliveryWorkflowState(
      deliveryId: deliveryId,
      step: step ?? this.step,
      pendingImageNotes: pendingImageNotes ?? this.pendingImageNotes,
      paymentMethodOverrideId: identical(paymentMethodOverrideId, _sentinel)
          ? this.paymentMethodOverrideId
          : paymentMethodOverrideId as String?,
    );
  }
}

const Object _sentinel = Object();
