import 'package:comwell_key_app/utils/json.dart';
import 'package:json_annotation/json_annotation.dart';

part '../../.generated/services/models/booking_dto.g.dart';

@JsonSerializable()
class BookingDTO {
  final String? roomNumber;
  final String hotelCode;
  final String firstName;
  final String lastName;
  final String bookerFirstName;
  final String bookerLastName;
  final List<GuestDTO> guests;
  final String confirmationNumber;
  final String dayIn;
  final String dayOut;
  final String? cancelTime;
  final String status;
  final bool? isCancelled;
  final String? bookTime;
  final String? roomType;
  final int adults;
  final int children;
  final num? balance;
  final bool isPrimaryGuest;
  final String? maskedCardNumber;
  final List<BookingAddonItem>? addOnItems;

  BookingDTO({
    required this.roomNumber,
    required this.hotelCode,
    required this.firstName,
    required this.lastName,
    this.bookerFirstName = '',
    this.bookerLastName = '',
    this.guests = const [],
    required this.confirmationNumber,
    required this.dayIn,
    required this.dayOut,
    required this.cancelTime,
    required this.status,
    this.isCancelled,
    required this.bookTime,
    required this.roomType,
    required this.adults,
    required this.children,
    required this.balance,
    required this.isPrimaryGuest,
    this.addOnItems,
    this.maskedCardNumber,
  });

  Json toJson() => _$BookingDTOToJson(this);

  factory BookingDTO.fromJson(Json json) => _$BookingDTOFromJson(json);

}

@JsonSerializable()
class GuestDTO {
  final int id;
  final String firstName;
  final String lastName;

  GuestDTO({
    required this.id,
    required this.firstName,
    required this.lastName,
  });

  Json toJson() => _$GuestDTOToJson(this);

  factory GuestDTO.fromJson(Json json) => _$GuestDTOFromJson(json);
}

@JsonSerializable()
class BookingAddonItem {
  final String code;
  final String description;
  final int quantity;
  final int price;

  BookingAddonItem(this.code, this.description, this.quantity, this.price);

  @override
  String toString() {
    return 'AddOnItem{code: $code, description: $description, quantity: $quantity, price: $price}';
  }

  factory BookingAddonItem.fromJson(Map<String, dynamic> json) => _$BookingAddonItemFromJson(json);

  Map<String, dynamic> toJson() => _$BookingAddonItemToJson(this);

  BookingAddonItem copyWith({int? quantity, int? price}) {
    return BookingAddonItem(code, description, quantity ?? this.quantity, price ?? this.price);
  }
}