public async Task <IActionResult> New([FromRoute] int roomId, [FromRoute] string selectedDate,
                                              [FromRoute] int selectedTime)
        {
            var room = await _roomRepository.GetRoomByIdAsync(roomId);

            if (room == null)
            {
                return(BadRequest());
            }

            if (!DateTime.TryParseExact(
                    selectedDate,
                    format: "dd.MM.yyyy",
                    provider: CultureInfo.CurrentCulture,
                    style: DateTimeStyles.None,
                    result: out var dateTime))
            {
                return(BadRequest(error: "Bad date format"));
            }

            var newReservation = new NewReservationVM
            {
                RoomId            = room.Id,
                RoomName          = room.Name,
                SelectedDate      = dateTime.ToString(format: "dd.MM.yyyy"),
                SelectedOpenTime  = selectedTime,
                SelectedCloseTime = selectedTime + 1
            };

            return(View(viewName: "Save", model: newReservation));
        }
        public async Task <ActionResult> Save(NewReservationVM newReservationVm)
        {
            DateTime.TryParseExact(
                newReservationVm.SelectedDate,
                format: "dd.MM.yyyy",
                provider: CultureInfo.CurrentCulture,
                style: DateTimeStyles.None,
                result: out var dateTime);

            if (!ModelState.IsValid)
            {
                return(View(viewName: "Save", model: newReservationVm));
            }

            var room = await _roomRepository.GetRoomByIdAsync(newReservationVm.RoomId);

            if (!room.AvailableHours(dateTime).Select(x => x.Open).Contains(newReservationVm.SelectedOpenTime))
            {
                TempData[key : "ErrorMessage"] = "Sorry the room for chosen time was already reserved.";

                return(RedirectToAction(nameof(RoomController.Detail), controllerName: "Room",
                                        routeValues: new { id = newReservationVm.RoomId }));
            }

            var customer = new Customer
            {
                FirstName   = newReservationVm.FirstName,
                SecondName  = newReservationVm.SecondName,
                Email       = newReservationVm.Email,
                PhoneNumber = newReservationVm.Email
            };

            await _customerReservationRepository.AddCustomer(customer);

            var time    = new TimeSpan(newReservationVm.SelectedOpenTime, 0, 0);
            var newDate = dateTime.Add(time);

            var reservation = new Reservation
            {
                Description     = newReservationVm.Description,
                DateReservation = newDate,
                PhoneNumber     = newReservationVm.PhoneNumber,
                CustomerId      = customer.Id,
                RoomId          = newReservationVm.RoomId
            };

            await _customerReservationRepository.AddReservation(reservation);

            room.Reservations.Add(reservation);

            await _customerReservationRepository.Save();

            return(RedirectToAction(nameof(RoomController.Index), controllerName: "Room"));
        }