public CheckBookingModel bookholidayhome(int Id, DateTime from, DateTime to)
        {
            from = from + new TimeSpan(0, 16, 0, 0);
            to   = to + new TimeSpan(0, 11, 0, 0);
            DateTime TimeofBookingMax = from - new TimeSpan(14, 0, 0, 0);

            CheckBookingModel model = new CheckBookingModel();

            List <ReserveObject> reservedList = new List <ReserveObject>();



            try
            {
                //change this
                //reservedList = context.ReserveObjects.Where(d => d.bookingFrom >= TimeofBookingMax && d.bookingFrom <= to).ToList();

                reservedList = context.HolidayHomes.Find(Id).reserveTimes.Where(d => d.bookingFrom >= TimeofBookingMax && d.bookingFrom <= to).ToList();
            }
            catch
            {
            }

            if (reservedList.Count() == 0)
            {
                model.Available          = true;
                model.DaysAvailable      = (to - from).Days;
                model.FirstDateAvailable = from;
            }
            else
            {
                model = CheckForAvailableDays(from, to, reservedList);
            }


            if (model.Available == true)
            {
                HolidayHome   home;
                ReserveObject reserve = new ReserveObject();
                reserve.bookingFrom = from;
                reserve.bookingToo  = to;
                reserve.totalNights = (int)Math.Round((to - from).TotalDays);



                try
                {
                    home = context.HolidayHomes.Find(Id);
                    home.reserveTimes.Add(reserve);
                    context.SaveChanges();
                }
                catch
                {
                }
            }



            return(model);
        }
        public ActionResult ReserveRoom(ReverveRoomModel model)
        {
            if (model.dateTo <= model.dateFrom)
            {
                ModelState.AddModelError("dateTo", "Date should be later than above");
            }

            if (model.dateFrom == null)
            {
                ModelState.AddModelError("dateFrom", "Pole nie moze być puste");
            }


            if (ModelState.IsValid)
            {
                //repository.BookHolidayHome(model.holidayhomeId, model.dateFrom, model.dateTo);

                CheckBookingModel modelbook = repository.bookroom(model.roomId, model.dateFrom, model.dateTo);
                ViewBag.checkbookingmodel = modelbook;

                return(RedirectToAction("ShowDetailsRoom", "Home", new { Id = model.roomId }));
            }
            else
            {
                Room            room       = repository.GetRoomById(model.roomId);
                List <DateTime> list       = repository.GetDaysBookedRoom(model.roomId);
                List <string>   liststring = new List <string>();

                foreach (var item in list)
                {
                    liststring.Add(item.ToShortDateString());
                }

                BookRoomViewModel viewmodel = new BookRoomViewModel();
                viewmodel.room = room;
                viewmodel.list = liststring;

                return(View("~/Views/Client/BookRoom.cshtml", viewmodel));



                //Room room = repository.GetRoomById(model.roomId);
                //return View("~/Views/Client/BookRoom.cshtml", room);
            }
        }
        public void when_calling_ReserveRoom_returns_model()
        {
            CheckBookingModel model = new CheckBookingModel();

            model.Available          = true;
            model.DaysAvailable      = 3;
            model.FirstDateAvailable = new DateTime(2019, 4, 13);
            model.room = new Room()
            {
                Price = 100, numberofGuests = 1, numberofBeds = 1, doubleBed = false, petsAllowed = false, Toilet = true, Kitchen = false, numberofTelevisions = 1
            };
            model.holidayHome = new HolidayHome()
            {
                HolidayHomeId = 3, Price = 200, numberofGuests = 1, numberofBeds = 1, doubleBed = false, petsAllowed = true, Toilet = true, Kitchen = false, numberofTelevisions = 1, numberofFloors = 1
            };


            ReverveRoomModel reservemodel = new ReverveRoomModel();

            reservemodel.dateFrom = new DateTime(2019, 4, 2);
            reservemodel.dateTo   = new DateTime(2019, 4, 5);
            reservemodel.roomId   = 3;



            Mock <IHolidaysRepository> mock = new Mock <IHolidaysRepository>();

            mock.Setup(r => r.bookroom(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>())).Returns(model);

            ClientController      controller = new ClientController(mock.Object);
            RedirectToRouteResult result     = (RedirectToRouteResult)(controller.ReserveRoom(reservemodel));

            Assert.AreEqual("ShowDetailsRoom", result.RouteValues["action"]);
            Assert.AreEqual("Home", result.RouteValues["controller"]);
            Assert.AreEqual(3, result.RouteValues["Id"]);
        }
        //public bool BookHolidayHome(int Id, DateTime from, DateTime to)
        //{
        //    if (from >= to || DateTime.Now >= to)
        //    {
        //        return false;
        //    }
        //    from.AddHours(16);
        //    to.AddHours(11);
        //    HolidayHome home;
        //    ReserveObject reserve = new ReserveObject();
        //    reserve.bookingFrom = from;
        //    reserve.bookingToo = to;
        //    reserve.totalDays = to.Subtract(from).Days;
        //    reserve.totalHours = to.Subtract(from).Hours;


        //    try
        //    {
        //        home = context.HolidayHomes.Find(Id);
        //        home.reserveTimes.Add(reserve);
        //        context.SaveChanges();



        //        return true;
        //    }
        //    catch
        //    {
        //        return false;
        //    }



        //}



        public CheckBookingModel CheckForAvailableDays(DateTime from, DateTime to, List <ReserveObject> list)
        {
            CheckBookingModel model = new CheckBookingModel();

            List <DateTime> listofdaystobook = new List <DateTime>();


            List <DateTime> DaysToRemove = new List <DateTime>();



            int nightsCount = (int)Math.Round((to - from).TotalDays);

            //int daysCount = (int)Math.Round((to - from).TotalDays+1);
            for (int i = 0; i < nightsCount; i++)
            {
                //listofdaystobook.Add(new DateTime(from.Year, from.Month, (from.Day + i),16,0,0));
                DateTime day = from;
                day.AddHours(16);
                day.AddDays(i);
                listofdaystobook.Add(day);
            }



            //listofdaystobook[0]=listofdaystobook[0].AddHours(16);

            //  int count=  listofdaystobook.Count-1;

            //    listofdaystobook[count]= listofdaystobook[count].AddHours(11);


            foreach (var datetime in listofdaystobook)
            {
                foreach (var reserveobj in list)
                {
                    if (datetime == reserveobj.bookingFrom || datetime == reserveobj.bookingToo || (datetime > reserveobj.bookingFrom && datetime < reserveobj.bookingToo))
                    {
                        DaysToRemove.Add(datetime);
                    }
                    else
                    {
                    }
                }
            }

            DaysToRemove = DaysToRemove.Distinct().ToList();

            foreach (var item in DaysToRemove)
            {
                try
                {
                    listofdaystobook.Remove(item);
                }
                catch
                {
                }
            }



            if (listofdaystobook.Count == 0)
            {
                return(model);
            }
            else
            {
                if (nightsCount == listofdaystobook.Count)
                {
                    model.Available = true;
                }
                else
                {
                    model.Available = false;
                }

                model.DaysAvailable = listofdaystobook.Count;
                listofdaystobook.Sort((x, y) => x.Day.CompareTo(y.Day));
                model.FirstDateAvailable = listofdaystobook.FirstOrDefault();


                return(model);
            }
        }