/*
         * This method display booking details with prices and other
         * details and request user to confirm the booking
         */
        public ActionResult BookHotel(int?id, int?roomId)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            Book_Hotel book = new Book_Hotel();

            book             = TempData["BookHotelRoom"] as Book_Hotel;
            book.hotel       = db.Hotels.Find(id);
            book.room        = db.Rooms.Find(roomId);
            book.room.Status = "Booked";
            //Calculate Price
            int totalPrice = book.room.PricePerNight * book.booking.no_of_night_stay;

            book.booking.price       = totalPrice;
            book.booking.book_status = "Confirmed";
            book.booking.hotel_id    = id;

            book.booking.customer_id = User.Identity.GetUserId();

            if (book.hotel == null)
            {
                return(HttpNotFound());
            }
            TempData["BookAndHotelDetail"] = book;
            return(View(book));
        }
        public ActionResult DisplayHotelWithSearchInfo(Booking book)
        {
            Validate validation = new Validate();
            Boolean  validDate;

            book.no_of_night_stay = validation.getNoOfNightsToStay(book.from_date, book.to_date);
            validDate             = validation.checkFromAndToDate(book.from_date, book.to_date);
            if (validDate == false)
            {
                TempData["DateView"] = "Invalid Check-in and Check-out Date";
                return(Redirect("/Bookings/SearchHotel"));
            }
            else
            {
                Book_Hotel book_hotel = new Book_Hotel();
                book_hotel.booking            = book;
                TempData["DisplaySearchInfo"] = book_hotel;
                return(Redirect("/Bookings/DisplayHotel"));
            }
        }
        /*
         * This method displays available rooms along with map
         * based on given check-in and check-out date
         */

        public ActionResult DisplayHotel()
        {
            // var bookings = db.Bookings.Include(b => b.Hotel);
            //return View(bookings.ToList());

            Validate    validation = new Validate();
            List <Room> room       = db.Rooms.ToList();

            var roomWithHotel = db.Rooms.Include(b => b.Hotel);

            List <Room> specificRoom = new List <Room>();
            Book_Hotel  book1        = new Book_Hotel();

            book1 = TempData["DisplaySearchInfo"] as Book_Hotel;
            int no_of_adults = book1.booking.no_of_adults;

            specificRoom = validation.getSpecificRoomDetails(room, no_of_adults);

            TempData["BookHotelRoom"] = book1;
            return(View(specificRoom.ToList()));
        }
        public ActionResult BookHotel(Book_Hotel book_hotel)
        {
            if (ModelState.IsValid)
            {
                book_hotel = TempData["BookAndHotelDetail"] as Book_Hotel;
                Booking current_book = new Booking();
                current_book = book_hotel.booking;


                var findRoom = db.Rooms.Where(r => (r.Id == book_hotel.room.Id)).FirstOrDefault();
                findRoom.Status = book_hotel.room.Status;

                //db.Rooms.Find()
                db.Bookings.Add(current_book);
                db.SaveChanges();

                TempData["ConfirmHotel"] = book_hotel;


                return(Redirect("/Bookings/EmailConfirmation"));
            }
            return(View(book_hotel));
        }
        /*
         * This method send booking confirmation mail
         * automatically once user clicked "confirm booking"
         * for any rooms
         */
        public ActionResult EmailConfirmation(Book_Hotel book_hotel)
        {
            try
            {
                book_hotel = TempData["ConfirmHotel"] as Book_Hotel;
                Booking current_book = new Booking();
                current_book = book_hotel.booking;
                Validate validation = new Validate();

                var    userId   = User.Identity.GetUserId();
                String toEmail  = validation.getEmailIdFromAspUsers(userId);
                String subject  = "Booking Confirmation";
                String contents = "Dear Customer," + "<br/>" +
                                  "<p align ='center'>" + "Check-in: " + current_book.from_date + "<br/>"
                                  + "Check-out: " + current_book.to_date + "<br/>"
                                  + "Number of Nights to Stay: " + current_book.no_of_night_stay + "<br/>"
                                  + "Number of Adults: " + current_book.no_of_adults + "<br/>"
                                  + "Number of Children: " + current_book.no_of_children + "<br/>"
                                  + "Hotel Name: " + book_hotel.hotel.Name + "<br/>"
                                  + "Hotel Address: " + book_hotel.hotel.Address + "<br/>"
                                  + "Price: :$" + current_book.price + " AUD" + "<br/>"
                                  + "Booking Status: Confirmed" + "<p>" + "<br/>" + "<br/>" + "<br/>"
                                  + "Thanks," + "<br/>"
                                  + "Trivago Team";


                EmailSender es = new EmailSender();
                es.Send(toEmail, subject, contents);
                ViewBag.Result = "Email has been send to your registered email id";
                ModelState.Clear();
                return(View());
            }
            catch
            {
                return(View());
            }
        }