public void GetValidBookings()
        {
            var bookings      = BookingsRepository.GetAll();
            var validBookings = bookings.Where(x => x.ToDate < DateTime.Now && x.IsCancelled == false).ToList();

            validBookings.ForEach(x => x.PrintInfo());
        }
        public void GetBookingById()
        {
            Console.WriteLine("Please enter booking ID:");
            var checkBookingId = int.TryParse(Console.ReadLine(), out int bookingId);

            CheckInput(checkBookingId);
            var booking = BookingsRepository.GetById(bookingId);

            if (booking == null)
            {
                throw new FlowException("Booking not found!");
            }
            booking.PrintInfo();
        }
        public void CancelBooking()
        {
            Customers customer = FindCustomerByEmail();

            Console.WriteLine("Please enter booking reference code:");
            var refCode  = Console.ReadLine();
            var bookings = BookingsRepository.GetAll();
            var booking  = bookings.FirstOrDefault(x => x.RefCode == refCode && x.FromDate > DateTime.Now && x.CustomerId == customer.Id);

            if (booking == null)
            {
                throw new FlowException("Booking not found!");
            }
            Console.WriteLine($"Confirm you want to cancel booking {booking.RefCode}? Enter y if yes!");
            var confirm = Console.ReadLine();

            if (confirm.ToLower() == "y")
            {
                booking.IsCancelled = true;
            }
            BookingsRepository.Update(booking);
            BookingsRepository.SaveEntities();
            Console.WriteLine("Booking is cancelled!Please check your credit card after 10 minutes!");
        }
        public void Book()
        {
            Customers customer = FindCustomerByEmail();
            var       bookings = BookingsRepository.GetAllInclude(x => x.BookingRooms);
            var       rooms    = RoomsRepository.GetAllInclude(x => x.BookingRooms);
            var       maxDate  = Convert.ToDateTime("01/01/2021 12:00:00 AM");

            Console.WriteLine($"Max booking date: {maxDate}");
            Console.WriteLine("Please enter Check-In date (format MM/dd/yyyy !):");
            var validFrom = Convert.ToDateTime(Console.ReadLine());

            if (validFrom < DateTime.Now || validFrom > maxDate)
            {
                throw new FlowException("Please enter valid date!");
            }
            Console.WriteLine("Please enter Check-Out date (format MM/dd/yyyy !):");
            var validTo = Convert.ToDateTime(Console.ReadLine());

            if (validTo <= validFrom || validTo > maxDate)
            {
                throw new FlowException("Please enter valid date!");
            }
            var newBooking = new Bookings()
            {
                CustomerId   = customer.Id,
                NumberOfDays = int.Parse((validTo - validFrom).TotalDays.ToString()),
                FromDate     = validFrom,
                ToDate       = validTo,
                IsCancelled  = false,
                RefCode      = GenerateRefCode(),
                BookingRooms = new List <BookingRooms>()
            };
            var activeBookings = bookings.Where(x => x.ToDate > DateTime.Now && x.ToDate > validFrom).ToList();
            var roomsList      = new List <int>();

            foreach (var booking in activeBookings)
            {
                if (booking.IsCancelled != true)
                {
                    roomsList.AddRange(booking.BookingRooms.Select(x => x.RoomId).ToList());
                }
            }
            Console.WriteLine(string.Join(",", roomsList));
            bool anotherRoom = true;

            while (anotherRoom)
            {
                PrintAvailRooms(roomsList, rooms);
                Rooms room       = FindRoom();
                var   bookedRoom = new BookingRooms()
                {
                    RoomId    = room.Id,
                    BookingId = newBooking.Id
                };
                bool available = CheckRoomAvail(roomsList, room);
                if (available == false)
                {
                    throw new FlowException("Room is not available!");
                }
                var checkRoom = newBooking.BookingRooms.FirstOrDefault(x => x.RoomId == room.Id);
                if (checkRoom != null)
                {
                    throw new FlowException("You already have this room!");
                }
                Console.WriteLine($"This room has {room.MaxPersons} max persons allowed! You may need to book another room if needed!");
                Console.WriteLine("Please enter number of persons:");
                var checkPersons = int.TryParse(Console.ReadLine(), out int roomPersons);
                CheckInput(checkPersons);
                CheckAboveZero(roomPersons);
                if (roomPersons > room.MaxPersons)
                {
                    throw new FlowException("Please check room details!");
                }
                newBooking.BookingRooms.Add(bookedRoom);
                Console.WriteLine("Do you want to add another room to your booking? Enter y if yes,any other key if no!");
                var userChoice = Console.ReadLine();
                anotherRoom = userChoice.ToLower() == "y";
            }
            Console.WriteLine($"You have booked successfully! Your Reference Code is: {newBooking.RefCode}");
            BookingsRepository.Add(newBooking);
            BookingsRepository.SaveEntities();
        }
 public HotelService()
 {
     BookingsRepository  = new BookingsRepository();
     CustomersRepository = new CustomersRepository();
     RoomsRepository     = new RoomsRepository();
 }