import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/overview/models/guest.dart';
import 'package:comwell_key_app/overview/models/room.dart';
import 'package:comwell_key_app/services/models/booking_dto.dart';
import 'package:comwell_key_app/services/models/room_dto.dart';
import 'room_mapper.dart';
//TODO: Fix actual image
extension BookingDTOMapper on BookingDTO {
Booking toBooking() {
final startDate = DateTime.parse(dayIn);
final endDate = DateTime.parse(dayOut);
final mappedGuests = guests.map(
(guest) => Guest(
firstName: guest.firstName,
lastName: guest.lastName,
id: guest.id,
),
).toList();
return Booking(
id: confirmationNumber,
confirmationNumber: confirmationNumber,
roomNumber: roomNumber ?? "",
startDate: startDate,
endDate: endDate,
reservationStatus: ReservationStatus.fromString(status),
image: "assets/images/no_current_bookings_background.jpeg",
hotelName: "Hotel $hotelCode",
roomType: roomType ?? '',
addOnItems: addOnItems,
balance: balance ?? 0,
children: children,
firstName: firstName,
lastName: lastName,
bookerFirstName: bookerFirstName,
bookerLastName: bookerLastName,
adults: adults,
hotelCode: hotelCode,
bookingDate: startDate,
digitalCard: true,
isPrimaryGuest: isPrimaryGuest,
maskedCardNumber: maskedCardNumber,
guests: mappedGuests,
);
}
}
extension BookingMapper on Booking {
BookingDTO toDTO() {
final firstName = this.firstName;
final lastName = this.lastName;
final mappedGuests = guests
.map(
(guest) => GuestDTO(
id: guest.id,
firstName: guest.firstName,
lastName: guest.lastName,
),
)
.toList();
return BookingDTO(
roomNumber: roomNumber,
hotelCode: hotelCode,
firstName: firstName,
lastName: lastName,
bookerFirstName: firstName,
bookerLastName: lastName,
guests: mappedGuests,
confirmationNumber: confirmationNumber,
dayIn: startDate.toIso8601String(),
dayOut: endDate.toIso8601String(),
cancelTime: null,
isCancelled: false,
bookTime: startDate.toIso8601String(),
status: reservationStatus.name,
roomType: roomType,
adults: adults,
children: children,
balance: balance ?? 0,
isPrimaryGuest: isPrimaryGuest,
addOnItems: addOnItems ?? [],
);
}
}
extension BookingWithRoomsMapper on Booking {
Booking withRooms(List<Room> rooms) {
return Booking(
id: id,
confirmationNumber: confirmationNumber,
roomNumber: roomNumber,
startDate: startDate,
endDate: endDate,
reservationStatus: reservationStatus,
image: image,
hotelName: hotelName,
roomType: roomType,
addOnItems: addOnItems,
balance: balance,
children: children,
firstName: firstName,
lastName: lastName,
bookerFirstName: bookerFirstName,
bookerLastName: bookerLastName,
adults: adults,
hotelCode: hotelCode,
bookingDate: bookingDate,
digitalCard: digitalCard,
isPrimaryGuest: isPrimaryGuest,
maskedCardNumber: maskedCardNumber,
);
}
}
extension ListRoomMapper on List<RoomDto> {
List<Room> toRooms() => map((dto) => dto.toRoom()).toList();
}
extension ListBookingMapper on Iterable<BookingDTO> {
Iterable<Booking> toBookings() => map((dto) => dto.toBooking());
}
extension RoomTypeMapper on Booking {
String toRoomType() {
switch (roomType) {
case "SDPBO":
return "Standard Double Plus Room";
case "SDBO":
return "Standard Double Room";
case "STPBO":
return "Standard Twin Plus Room";
case "STPO":
return "Standard Twin Room";
case "SUBO":
return "Suite";
default:
return "Room";
}
}
}