public void RoomsCreate()
 {
     RoomsController controller = new RoomsController();
     Room rm = new Room();
     rm.AccomodationId = 1;
     rm.NumberOfRooms = 23;
     rm.Price = 50;
     rm.TempReservationString = "reserved";
     rm.RoomCapacity = 2;
     rm.RoomId = 0;  
     rm.RoomTypeId = 1;
     rm.RoomDetails = " Air conditioning, Desk, Heating, Shower, Hairdryer,Flat-screen TV, Wi-Fi,Pay-per-view channels,Minibar";
     var result = controller.Create(rm);
     Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
    
 }
        public void RoomCreateInvalidInput()
        {
            RoomsController controller = new RoomsController();
            Room rm = new Room();
            rm.AccomodationId = 1;
            rm.NumberOfRooms = -23;
            rm.Price = -50;
            rm.TempReservationString = "reserved";
            rm.RoomCapacity = -2;
            rm.RoomId = 0;
            rm.RoomTypeId = 1;
            rm.RoomDetails = " Air conditioning, Desk, Heating, Shower, Hairdryer,Flat-screen TV, Wi-Fi,Pay-per-view channels,Minibar";


            var context = new ValidationContext(rm, null, null);
            var results = new List<ValidationResult>();
            TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Room), typeof(Room)), typeof(Room));

            var isModelStateValid = Validator.TryValidateObject(rm, context, results, true);
            Assert.AreEqual(false, isModelStateValid);

        }
        //public ActionResult GetAvailability(DateTime? from, DateTime? to)
        //{

        //    //TESTNI PODACI SU U PITANJU - TREBA IMPLEMENTIRATI PRAVE PODATKE 
        //    //TESTNI PODACI SU U PITANJU - TREBA IMPLEMENTIRATI PRAVE PODATKE 
        //    //TESTNI PODACI SU U PITANJU - TREBA IMPLEMENTIRATI PRAVE PODATKE 
        //    //TESTNI PODACI SU U PITANJU - TREBA IMPLEMENTIRATI PRAVE PODATKE
        //    //TESTNI PODACI SU U PITANJU - TREBA IMPLEMENTIRATI PRAVE PODATKE 

        //    RoomAvailability roomCheck = new RoomAvailability() { AccomodationId = 50, ArrivalDate = from.Value, DepartureDate = to.Value, IsPaid = true, RoomId = 67, RoomAvailabilityId = 3, UserId = 1 };

        //    var currentBooking = db.RoomAvailabilities.Where((x => x.RoomId == 67 && x.AccomodationId == 50 &&
        //        (from <= x.DepartureDate && from >= x.ArrivalDate || x.ArrivalDate <= to && x.ArrivalDate >= from)))
        //        .FirstOrDefault();

        //    if (currentBooking != null)
        //    {
        //        return View(roomCheck);
        //    }

        //    db.RoomAvailabilities.Add(roomCheck);
        //    db.SaveChanges();

        //    return RedirectToAction("Index");
        //}

        public Room GetAvailabilityAndPrice(int accomodationId, int roomId, DateTime? from, DateTime? to,string UserId)   //nedostaje UserID da bi se znalo za koga se soba rezerviše
        {
            var currentBooking = db.RoomAvailabilities.Where((x => x.RoomId == roomId && x.AccomodationId == accomodationId &&
                (from <= x.DepartureDate && from >= x.ArrivalDate || x.ArrivalDate <= to && x.ArrivalDate >= from)))
                .ToList();

            //if (currentBooking != null)
            //{
            //    return null;
            //}

            
            var roomTypeId = db.Rooms.Where(x => x.RoomId == roomId).SingleOrDefault().RoomTypeId;
            var pricePerNight = db.Rooms.Where(x => x.RoomId == roomId).SingleOrDefault().Price;
            var numberOfRooms = db.Rooms.Where(x => x.RoomId == roomId).SingleOrDefault().NumberOfRooms;
            var roomCapacity = db.Rooms.Where(x => x.RoomId == roomId).SingleOrDefault().RoomCapacity;

            //START - NEW TEST

            if (currentBooking.Count >= numberOfRooms)
            {
                return null;
            }
            
            //END - NEW TEST



            Room foundRoom = new Room() { 
                AccomodationId = accomodationId, 
                Price = pricePerNight, 
                RoomId = roomId, 
                RoomTypeId = roomTypeId,
                ListOfAvailableRooms = null,
                NumberOfRooms = numberOfRooms,
                RoomCapacity = roomCapacity,
                TempArrivalDate = from.Value,
                TempDepartureDate = to.Value,
                TempIsPaid = false,
                TempUserId = UserId
            };
           

            double totalPrice = 0;
            DateTime currentDay = new DateTime();
            double pricePerDay = 0;

            currentDay = from.Value;

            while (currentDay <= to.Value)
            {
                try
                {
                    pricePerDay = db.RoomPrices.Where(x => x.StartDate <= currentDay && x.EndDate >= currentDay && x.RoomTypeId == roomTypeId && x.AccomodationId == foundRoom.AccomodationId)
                                        .FirstOrDefault().SpecialPrice;
                }
                catch (Exception)
                {
                    //Implement the error LOG when the user does not sets the prices for a room on certain dates. The error will be cought here!
                    totalPrice += db.Rooms.Where(x => x.RoomId == roomId).SingleOrDefault().Price;
                }
                totalPrice += pricePerDay;
                currentDay = currentDay.AddDays(1);
            }

            double totalDays = (to.Value - from.Value).TotalDays;

            foundRoom.Price = totalPrice / totalDays;

            foundRoom.TempTotalPrice = totalPrice;
            
            return foundRoom;
        }