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";
    }
  }
}