import 'package:hl_lieferservice/domain/entity/car.dart';

/// Port für Fahrzeug-Stammdaten des angemeldeten Fahrers.
///
/// Bewusst **kein** `personalnummer`/`teamId`-Parameter: der Account
/// wird serverseitig aus dem JWT abgeleitet, der Client muss nichts
/// mitschicken. Eine Methode, die einen Account-Filter ermöglicht,
/// ist konsequent nicht vorgesehen.
///
/// Implementierungen werfen anwendungs-spezifische Exceptions
/// (z. B. `CarsRepositoryException`) — der Aufrufer fängt sie und
/// übersetzt in UI-Zustand.
abstract interface class CarsRepository {
  /// Liste der Fahrzeuge des angemeldeten Accounts.
  /// `includeInactive=false` blendet deaktivierte Fahrzeuge aus
  /// (Default für die App-UI).
  Future<List<Car>> listMine({bool includeInactive = false});

  /// Legt ein neues Fahrzeug mit dem gegebenen Kennzeichen an.
  /// Wirft, wenn das Kennzeichen für den Account schon existiert.
  Future<Car> create({required String plate});

  /// Aktualisiert ein bestehendes Fahrzeug.
  /// Beide Optional-Parameter `null` ist ein No-Op-PATCH.
  /// Soft-Delete erfolgt über `update(carId: ..., active: false)`.
  Future<Car> update({
    required String carId,
    String? plate,
    bool? active,
  });
}

/// Allgemeine Repository-Exception. Konkrete Implementierungen
/// können spezifischere Subtypen werfen (z. B. `CarsUnauthorized`).
class CarsRepositoryException implements Exception {
  const CarsRepositoryException(this.message, [this.cause]);

  final String message;
  final Object? cause;

  @override
  String toString() => 'CarsRepositoryException: $message';
}
