import 'package:flutter/foundation.dart';

/// Repository für prozess-übergreifende Aktionen entlang des
/// Phasen-Workflows (Sortieren → Beladen → Ausliefern).
///
/// Aktuell nur ein Stub: Sobald der entsprechende Backend-Endpunkt
/// von DOCUcontrol/VARIOcontrol bereitsteht, wird hier die echte
/// HTTP-Implementierung eingehängt — die Aufrufer (TourBloc) bleiben
/// dann unverändert.
class ProcessRepository {
  ProcessRepository();

  /// Persistiert die vom Fahrer bestätigte Lieferreihenfolge für ein
  /// Fahrzeug am Backend. Wird ausschließlich beim Bestätigen-Button
  /// in der Sortier-Page aufgerufen, nicht bei jedem Drag&Drop —
  /// das lokale Reorder läuft weiterhin nur über ReorderService.
  Future<void> persistDeliveryOrder({
    required String carId,
    required List<String> orderedDeliveryIds,
  }) async {
    // STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
    await Future.delayed(const Duration(milliseconds: 200));
    debugPrint(
      "ProcessRepository.persistDeliveryOrder (stub) — carId=$carId, "
      "order=$orderedDeliveryIds",
    );
  }

  /// Hebt die Zuordnung einer Lieferung zu einem Fahrzeug auf. Wird im
  /// Auswahl-Schritt verwendet, wenn der Fahrer eine bereits seinem Auto
  /// zugeordnete Lieferung wieder "freigibt", damit ein Kollege sie
  /// übernehmen kann.
  ///
  /// TODO(backend): Echte HTTP-Implementierung sobald der DOCUcontrol-
  /// bzw. VARIOcontrol-Endpoint zum Entfernen der Fahrzeug-Zuordnung
  /// steht. Aktuell nur Stub mit Log, damit der UI-Flow getestet werden
  /// kann; die Tour wird nach diesem Call NICHT automatisch refresht
  /// (das übernimmt später der Stream nach dem echten Endpoint).
  Future<void> unassignDeliveryFromCar({
    required String deliveryId,
  }) async {
    // STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
    await Future.delayed(const Duration(milliseconds: 200));
    debugPrint(
      "ProcessRepository.unassignDeliveryFromCar (stub) — "
      "deliveryId=$deliveryId",
    );
  }

  /// Meldet einen vom Fahrer dokumentierten Lieferungs-Abbruch (komplette
  /// Lieferung) an das Backend mit Begründung. Wird zusätzlich zum
  /// bestehenden `cancelDelivery`-Endpoint im [TourRepository] gefeuert,
  /// damit auf Backend-Seite die Stornogründe getrennt geführt werden
  /// können (Reporting / Logistik-Audit).
  ///
  /// TODO(backend): Echte HTTP-Implementierung sobald der DOCUcontrol-
  /// Endpoint zum Berichten eines Abbruch-Grunds bereitsteht. Bis dahin
  /// nur Log, damit der UI-Flow geübt werden kann.
  Future<void> reportDeliveryCancelled({
    required String deliveryId,
    required String reason,
  }) async {
    // STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
    await Future.delayed(const Duration(milliseconds: 200));
    debugPrint(
      "ProcessRepository.reportDeliveryCancelled (stub) — "
      "deliveryId=$deliveryId, reason=$reason",
    );
  }

  /// Meldet einen einzelnen Artikel oder eine Komponente als "heute nicht
  /// auszuliefern" (Teilabbruch). Der Eintrag bleibt in der Lieferung
  /// bestehen, wird aber im UI ausgegraut und vom Beladen-Fortschritt
  /// ausgeschlossen. [componentId] wird genau dann gesetzt, wenn nur eine
  /// einzelne Stücklisten-Position betroffen ist.
  ///
  /// TODO(backend): Echte HTTP-Implementierung sobald der DOCUcontrol-/
  /// VARIOcontrol-Endpoint für "Position zurückhalten" bereitsteht. Bis
  /// dahin wird der Hold-State ausschließlich lokal in der jeweiligen
  /// Beladen-Page gehalten (siehe `LoadingCustomerPage._heldKeys`).
  Future<void> reportItemHeld({
    required String deliveryId,
    required String articleId,
    String? componentId,
    required String reason,
  }) async {
    // STUB: Echte HTTP-Implementierung folgt, sobald der Endpoint steht.
    await Future.delayed(const Duration(milliseconds: 200));
    debugPrint(
      "ProcessRepository.reportItemHeld (stub) — "
      "deliveryId=$deliveryId, articleId=$articleId, "
      "componentId=$componentId, reason=$reason",
    );
  }
}
