private async Task<bool> ValidateFormModelAndFiles(MovieFormMainModel formModel, List<IFormFile> files)
        {
            if (!ModelState.IsValid)
            {
                await this.PopulateFormMainModel(formModel);

                return false;
            }

            this.posters = new List<byte[]>();
            foreach (IFormFile file in files)
            {
                bool isValidImage = await Task.Run(() => file.ValidateImage(ModelState));

                if (!isValidImage)
                {
                    await this.PopulateFormMainModel(formModel);

                    return false;
                }

                byte[] imageBytes = await file.ToByteArrayAsync();
                posters.Add(imageBytes);
            }

            return true;
        }
 private async Task PopulateFormMainModel(MovieFormMainModel formModel)
 {
     formModel.AllColors = await this.GetAllColors();
     formModel.AllCountries = await this.GetAllCountries();
     formModel.AllGenres = await this.GetAllGenres();
     formModel.AllLanguages = await this.GetAllLanguages();
 }
        public async Task<IActionResult> Create()
        {
            var formModel = new MovieFormMainModel()
            {
                ProductionYear = DateTime.UtcNow.Year
            };

            await this.PopulateFormMainModel(formModel);

            return View(formModel);
        }
        public async Task<IActionResult> Edit(int id)
        {
            MovieDetailsServiceModel movieDetails
                = await this.movieDbService.GetMovieDetailsAsync(id);

            if (movieDetails == null)
            {
                return NotFound();
            }

            MovieFormMainModel formModel = new MovieFormMainModel();

            IMapper config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<MovieDetailsServiceModel, MovieFormMainModel>()
                    .ForMember(dest => dest.Cast, opts => opts
                        .MapFrom(source => source.Cast.Select(c =>
                            new CastFormModel() { ImdbId = c.ImdbId, Name = c.Name, Character = c.Character })))
                    .ForMember(dest => dest.Crew, opts => opts
                        .MapFrom(source => source.Crew.Select(c =>
                            new CrewFormModel() { ImdbId = c.ImdbId, Name = c.Name, Role = c.Role })))
                    .ForMember(dest => dest.SelectedColors, opts => opts
                        .MapFrom(source => source.Colors.Select(c => c.Id)))
                    .ForMember(dest => dest.SelectedCountries, opts => opts
                        .MapFrom(source => source.Countries.Select(c => c.Id)))
                    .ForMember(dest => dest.SelectedGenres, opts => opts
                        .MapFrom(source => source.Genres.Select(g => g.Id)))
                    .ForMember(dest => dest.SelectedLanguages, opts => opts
                        .MapFrom(source => source.Languages.Select(l => l.Id)));
            })
            .CreateMapper();

            formModel = config.Map<MovieDetailsServiceModel, MovieFormMainModel>(movieDetails);

            await this.PopulateFormMainModel(formModel);

            return View(formModel);
        }
        public async Task<IActionResult> Search(MovieSearchTitleFormModel formSearchModel)
        {
            const string none = WebConstants.RadioButtonNoneValue;

            string blurayDotComTitleId = formSearchModel.BlurayDotComSelectedTitle;
            string boxOfficeMojoTitleId = formSearchModel.BoxOfficeMojoSelectedTitle;
            string dvdEmpireTiteId = formSearchModel.DvdEmpireSelectedTitle;
            string imdbTitleId = formSearchModel.ImdbSelectedTitle;
            string rottenTomatoesTitleId = formSearchModel.RottenTomattoesSelectedTitle;

            MovieFormMainModel formMainModel = new MovieFormMainModel();

            #region Blu-ray.com

            if (!string.IsNullOrEmpty(blurayDotComTitleId) && blurayDotComTitleId != none)
            {
                //BlurayDotComMainServiceModel blurayDotComServiceModel
                //    = await this.blurayDotComService.GetMovieDataAsync(blurayDotComTitleId);
            }

            #endregion Blu-ray.com

            #region Box Office Mojo

            if (!string.IsNullOrEmpty(boxOfficeMojoTitleId) && boxOfficeMojoTitleId != none)
            {
                try
                {
                    BoxOfficeMojoMainServiceModel boxOfficeMojoServiceModel
                                = await this.boxOfficeMojoService.GetMovieDataAsync(boxOfficeMojoTitleId);

                    IMapper config = new MapperConfiguration(cfg =>
                    {
                        cfg.CreateMap<BoxOfficeMojoMainServiceModel, MovieFormMainModel>();
                    })
                    .CreateMapper();

                    config.Map(boxOfficeMojoServiceModel, formMainModel);
                }
                catch (Exception ex)
                {
                    await Task.Run(() => ex.Log(nameof(HomeController), nameof(Search)));
                }
            }

            #endregion Box Office Mojo

            #region IMDb

            if (!string.IsNullOrEmpty(imdbTitleId) && imdbTitleId != none)
            {
                try
                {
                    ImdbMainServiceModel imdbServiceModel
                                = await this.imdbService.GetMovieDataAsync(imdbTitleId);

                    this.mapper.Map(imdbServiceModel, formMainModel);

                    IEnumerable<string> colorNames = imdbServiceModel.Colors;
                    formMainModel.SelectedColors
                        = await this.movieDbService.GetColorsIdFromNameAsync(colorNames);

                    IEnumerable<string> countryNames = imdbServiceModel.Countries;
                    formMainModel.SelectedCountries
                        = await this.movieDbService.GetCountriesIdFromNameAsync(countryNames);

                    IEnumerable<string> genreNames = imdbServiceModel.Genres;
                    formMainModel.SelectedGenres
                        = await this.movieDbService.GetGenresIdFromNameAsync(genreNames);

                    IEnumerable<string> languageNames = imdbServiceModel.Languages;
                    formMainModel.SelectedLanguages
                        = await this.movieDbService.GetLanguagesIdFromNameAsync(languageNames);
                }
                catch (Exception ex)
                {
                    await Task.Run(() => ex.Log(nameof(HomeController), nameof(Search)));
                }
            }

            #endregion IMDb

            #region Rotten Tomattoes

            if (!string.IsNullOrEmpty(rottenTomatoesTitleId) && rottenTomatoesTitleId != none)
            {
                try
                {
                    RottenTomatoesMainServiceModel rottenTomatoesServiceModel
                                = await this.rottenTomatoesService.GetMovieDataAsync(rottenTomatoesTitleId);

                    IMapper config = new MapperConfiguration(cfg =>
                    {
                        cfg.CreateMap<RottenTomatoesMainServiceModel, MovieFormMainModel>();
                    })
                   .CreateMapper();

                    config.Map(rottenTomatoesServiceModel, formMainModel);
                }
                catch (Exception ex)
                {
                    await Task.Run(() => ex.Log(nameof(HomeController), nameof(Search)));
                }
            }

            #endregion Rotten Tomattoes

            await this.PopulateFormMainModel(formMainModel);

            return View("Edit", formMainModel);
        }
        public async Task<IActionResult> Edit(int id, MovieFormMainModel formModel, List<IFormFile> files)
        {
            bool isValid = await this.ValidateFormModelAndFiles(formModel, files);

            if (!isValid)
            {
                return View(formModel);
            }

            List<CastServiceModel> castArtists = this.mapper
                .Map<IEnumerable<CastFormModel>, List<CastServiceModel>>(formModel.Cast);

            List<CrewServiceModel> crewArtists = this.mapper
                .Map<IEnumerable<CrewFormModel>, List<CrewServiceModel>>(formModel.Crew);

            bool success = false;
            byte[] thumbnail = await this.GetThumbnail();

            try
            {
                success = await this.movieDbService.EditMovieAsync(
                    id,
                    formModel.BoxOfficeMojoId,
                    formModel.Budget,
                    castArtists.AsNotNull(),
                    crewArtists.AsNotNull(),
                    formModel.GrossForeign,
                    formModel.GrossUsa,
                    formModel.ImdbId,
                    formModel.ImdbTop250,
                    formModel.ImdbUsersRating,
                    formModel.OriginalTitle,
                    posters,
                    formModel.ProductionYear,
                    formModel.RottenTomatoesCriticsScore,
                    formModel.RottenTomatoesId,
                    formModel.RottenTomatoesUsersScore,
                    formModel.Runtime,
                    formModel.SelectedColors.AsNotNull(),
                    formModel.SelectedCountries.AsNotNull(),
                    formModel.SelectedGenres.AsNotNull(),
                    formModel.SelectedLanguages.AsNotNull(),
                    formModel.Synopsis,
                    thumbnail,
                    formModel.Title);
            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty, ex.Message);

                await this.PopulateFormMainModel(formModel);

                return View(formModel);
            }

            if (success)
            {
                TempData[WebConstants.TempDataSuccessMessageKey]
                    = string.Format(MovieEditedSuccessMessage, formModel.Title);
            }
            else
            {
                TempData[WebConstants.TempDataErrorMessageKey]
                    = "Unsuccess";
            }

            return RedirectToAction(nameof(Index));
        }