class Reservation { final String id; final String status; final DateTime startDate; final DateTime endDate; final double totalAmount; final String paymentStatus; final String? vehicleId; final String? customerId; final VehicleSummary? vehicle; final CustomerSummary? customer; final DateTime createdAt; final String? source; final String? contractNumber; final String? invoiceNumber; const Reservation({ required this.id, required this.status, required this.startDate, required this.endDate, required this.totalAmount, required this.paymentStatus, this.vehicleId, this.customerId, this.vehicle, this.customer, required this.createdAt, this.source, this.contractNumber, this.invoiceNumber, }); int get days => endDate.difference(startDate).inDays; factory Reservation.fromJson(Map json) => Reservation( id: json['id'] as String, status: json['status'] as String, startDate: DateTime.parse(json['startDate'] as String), endDate: DateTime.parse(json['endDate'] as String), totalAmount: (json['totalAmount'] as num?)?.toDouble() ?? 0, paymentStatus: json['paymentStatus'] as String? ?? 'PENDING', vehicleId: json['vehicleId'] as String?, customerId: json['customerId'] as String?, vehicle: json['vehicle'] != null ? VehicleSummary.fromJson( json['vehicle'] as Map) : null, customer: json['customer'] != null ? CustomerSummary.fromJson( json['customer'] as Map) : null, createdAt: DateTime.parse( json['createdAt'] as String? ?? DateTime.now().toIso8601String()), source: json['source'] as String?, contractNumber: json['contractNumber'] as String?, invoiceNumber: json['invoiceNumber'] as String?, ); } class VehicleSummary { final String id; final String make; final String model; final int year; final String licensePlate; final List photos; const VehicleSummary({ required this.id, required this.make, required this.model, required this.year, required this.licensePlate, required this.photos, }); String get displayName => '$year $make $model'; String? get primaryPhoto => photos.isNotEmpty ? photos.first : null; factory VehicleSummary.fromJson(Map json) => VehicleSummary( id: json['id'] as String, make: json['make'] as String, model: json['model'] as String, year: json['year'] as int, licensePlate: json['licensePlate'] as String, photos: (json['photos'] as List?) ?.map((e) => e as String) .toList() ?? [], ); } class CustomerSummary { final String id; final String firstName; final String lastName; final String? email; final String? phone; const CustomerSummary({ required this.id, required this.firstName, required this.lastName, this.email, this.phone, }); String get fullName => '$firstName $lastName'; factory CustomerSummary.fromJson(Map json) => CustomerSummary( id: json['id'] as String, firstName: json['firstName'] as String, lastName: json['lastName'] as String, email: json['email'] as String?, phone: json['phone'] as String?, ); } class ReservationListResponse { final List data; final int total; final int page; final int pageSize; const ReservationListResponse({ required this.data, required this.total, required this.page, required this.pageSize, }); factory ReservationListResponse.fromApi(dynamic json) { if (json is List) { final reservations = json .map((e) => Reservation.fromJson(e as Map)) .toList(); return ReservationListResponse( data: reservations, total: reservations.length, page: 1, pageSize: reservations.length, ); } return ReservationListResponse.fromJson(json as Map); } factory ReservationListResponse.fromJson(Map json) => ReservationListResponse( data: ((json['data'] ?? const []) as List) .map((e) => Reservation.fromJson(e as Map)) .toList(), total: json['total'] as int? ?? ((json['data'] as List?)?.length ?? 0), page: json['page'] as int? ?? 1, pageSize: json['pageSize'] as int? ?? 20, ); }