public async Task <IActionResult> RemoveTagFromChooseDeck(ChooseDeckModel model)
        {
            model.FilterTags = model.FilterTagsString
                               .Split("#", StringSplitOptions.RemoveEmptyEntries)
                               .ToList();

            model.FilterTags.Remove(model.TagToRemove);
            model.TagFilter = String.Empty;

            if (model.FilterTags.Any())
            {
                model.FilterTagsString = model.FilterTags.Aggregate((x, y) => "#" + x + "#" + y + "#");

                if (!model.FilterTagsString.EndsWith('#'))
                {
                    model.FilterTagsString += "#";
                }
            }
            else
            {
                model.FilterTagsString = String.Empty;
            }

            return(View(nameof(ChooseDeck), await CreateChooseDeckModel(model)));
        }
        private async Task <ChooseDeckModel> CreateChooseDeckModel(ChooseDeckModel model)
        {
            var userWithDecks = await _userManager.GetUserAsync(User);

            var decksInModel = _context.Decks
                               .Where(deck => deck.CreatorId == userWithDecks.Id)
                               .Include(deck => deck.Tags)
                               .ToList();

            if (model.SearchFilter is not null)
            {
                decksInModel = decksInModel
                               .Where(deck => deck.Name
                                      .ToLower()
                                      .Contains(model.SearchFilter
                                                .ToLower()))
                               .ToList();
            }

            if (!String.IsNullOrEmpty(model.TagFilter))
            {
                if (model.FilterTagsString is null)
                {
                    model.FilterTagsString = "#";
                }

                if (!model.FilterTagsString.Contains($"#{model.TagFilter}#"))
                {
                    model.FilterTagsString += $"{model.TagFilter.ToLower().Split(' ').Aggregate((x, y) => x += "_" + y)}#";
                }
            }

            if (!String.IsNullOrEmpty(model.FilterTagsString))
            {
                model.FilterTags = model.FilterTagsString
                                   .Split("#", StringSplitOptions.RemoveEmptyEntries)
                                   .ToList();

                decksInModel = decksInModel
                               .Where(deck => !model.FilterTags
                                      .Except(deck.Tags is null ? new List <string>() : deck.Tags.Select(tag => tag.Name))
                                      .Any())
                               .ToList();
            }

            model.Decks = decksInModel
                          .Select(deck => new DeckModel {
                Id = deck.Id, Name = deck.Name
            })
                          .ToList();

            model.TagFilter = String.Empty;
            model.UserName  = userWithDecks.UserName;
            return(model);
        }
 public async Task <IActionResult> ChooseDeck(ChooseDeckModel model)
 => View(await CreateChooseDeckModel(model));