public async Task <IActionResult> Administration()
        {
            var user = await this.userManager.GetUserAsync(this.User);

            if (!user.IsAdmin)
            {
                return(this.NotFound());
            }

            IEnumerable <PlaceViewModel> places = this.placesService.GetAll <PlaceViewModel>().ToList();

            var viewModel = new ListPlaceViewModel
            {
                Places = places,
            };

            if (viewModel == null)
            {
                return(this.NotFound());
            }

            foreach (var place in viewModel.Places)
            {
                if (place.Reviews.Count > 0)
                {
                    place.Rating = (int)place.Reviews.Select(x => x.Rating).Average();
                }
                else
                {
                    place.Rating = 0;
                }
            }

            return(this.View(viewModel));
        }
        public IActionResult ShowAllPlaces(int?cityId, int?guestNumber, string?dates, string?sortBy, string?categoryName, int page = 1)
        {
            var cities  = this.citiesService.GetAll <CityDropDownViewModel>();
            var numbers = Enumerable.Range(1, 30).ToList();
            IEnumerable <GuestNumberDropDownViewModel> guestNumbers = numbers.Select(x => new GuestNumberDropDownViewModel {
                Id = x, Name = x.ToString()
            });

            IEnumerable <PlaceViewModel> places = this.placesService.GetAll <PlaceViewModel>().ToList();

            if (dates != null)
            {
                string[] splitDates = dates.Split(" - ");
                DateTime startDate  = DateTime.Parse(splitDates[0]);
                DateTime endDate    = DateTime.Parse(splitDates[1]);
                places = places.Where(p => this.CheckDates(startDate, endDate, p.Reservations.OrderBy(r => r.StartDate).ToList()));
            }

            if (categoryName != null)
            {
                places = places.Where(x => x.CategoryName == categoryName);
            }

            if (cityId != null && cityId != 0)
            {
                places = places.Where(x => x.CityId == cityId);
            }

            if (guestNumber != null && guestNumber != 0)
            {
                places = places.Where(x => x.MaxGuest >= guestNumber);
            }

            if (sortBy != null && sortBy != "id")
            {
                if (sortBy == "desc")
                {
                    places = places.OrderBy(p => p.PriceByNight);
                }
                else
                {
                    places = places.OrderByDescending(p => p.PriceByNight);
                }
            }

            var viewModel = new ListPlaceViewModel
            {
                Places     = places,
                Categories =
                    this.categoriesService.GetAll <IndexCategoryViewModel>(),
                Cities       = cities,
                GuestNumbers = guestNumbers,
            };

            if (viewModel == null)
            {
                return(this.NotFound());
            }

            foreach (var place in viewModel.Places)
            {
                if (place.Reviews.Count > 0)
                {
                    place.Rating = (int)place.Reviews.Select(x => x.Rating).Average();
                }
                else
                {
                    place.Rating = 0;
                }
            }

            //viewModel.CardPlaces = this.placesService.GetByCategoryId<CardPlaceViewModel>(viewModel.Id, PlacesPerPage, (page - 1) * PlacesPerPage);

            var count = viewModel.Places.Count(); //this.placesService.GetCountById(viewModel.Id);

            viewModel.PagesCount = (int)Math.Ceiling((double)count / PlacesPerPage);
            if (viewModel.PagesCount == 0)
            {
                viewModel.PagesCount = 1;
            }

            viewModel.CurrentPage = page;

            return(this.View(viewModel));
        }