private async Task ApplyFilters()
        {
            if (AllCards != null && !_suspendFilters)
            {
                var filtered =
                    from c in AllCards
                    where (!FilteredByFaction || (FactionFilter != Faction.UNALIGNED && c.ValidFactions.Contains(FactionFilter) && c.ValidFactions.Count() != FACTION_COUNT) ||
                           (FactionFilter == Faction.UNALIGNED && c.Faction == Faction.UNALIGNED && c.ValidFactions.Count() == FACTION_COUNT)) &&
                    (!FilteredByType || c.Type == TypeFilter) &&
                    (CostFilter == MAX_COSTS_FILTER || ((CostFilter == MAX_COSTS_FILTER - 1 && c.Cost >= CostFilter) || c.Cost == CostFilter)) &&
                    (RarityFilter == 0 || (int)c.Rarity == RarityFilter) &&
                    ((TraitFilter == null || !TraitFilter.Any()) || TraitFilter.Intersect(c.Traits).Any()) &&
                    (CurrentDeck == null || !FilterByDeck || CurrentDeck.Contains(c) || CurrentDeck.Champion == c) &&
                    (string.IsNullOrEmpty(CardSetFilter) || CardSetFilter == _CARD_SET_FILTER_DEFAULT || c.CardSet == (CardSet)Enum.Parse(typeof(CardSet), CardSetFilter)) &&
                    (string.IsNullOrEmpty(SearchText) ||
                     c.Text.ToLower().Contains(SearchText.ToLower()) ||
                     c.Name.ToLower().Contains(SearchText.ToLower()) ||
                     c.Race.ToString().ToLower().Contains(SearchText.ToLower()) ||
                     SearchText.ToUpper().Contains(c.CardSet.ToString()))
                    orderby c.Rarity == Rarity.TOKEN, c.Type == CardType.CHAMPION descending, c.Faction descending, c.Cost, c.Name
                select c;

                IsBusy = true;
                var newList = await Task.Run(() => filtered.ToList());

                FilteredCards = newList;
                IsBusy        = false;
                UpdateStatus();

                ResetFiltersCommand.RaiseCanExecuteChanged();
            }
        }
        private async Task DeckInitialize(Deck deck)
        {
            CurrentDeck = deck;
            IsChooser   = CurrentDeck != null;
            if (!IsChooser)
            {
                ChooserFilterText = "";
            }
            Message = "";

            if (IsChooser)
            {
                //filter cards according to deck
                AllCards = _unfilteredCards.Where((c) => (c.ValidFactions.Contains(CurrentDeck.DeckFaction) && c.Rarity != Rarity.TOKEN)).ToList();

                ChooserFilterText   = "IconDeckFilter.png";
                CanFilterByEclipse  = CurrentDeck.DeckFaction == Faction.ECLIPSE;
                CanFilterByScales   = CurrentDeck.DeckFaction == Faction.SCALES;
                CanFilterByStrife   = CurrentDeck.DeckFaction == Faction.STRIFE;
                CanFilterByThorns   = CurrentDeck.DeckFaction == Faction.THORNS;
                CanFilterBySilence  = CurrentDeck.DeckFaction == Faction.SILENCE;
                CanFilterByEssence  = CurrentDeck.DeckFaction == Faction.ESSENCE;
                CanFilterByDelirium = CurrentDeck.DeckFaction == Faction.DELIRIUM;
                CanFilterByEighth   = (int)CurrentDeck.DeckFaction == 9;

                if (ResetFiltersCommand.CanExecute(null))
                {
                    ResetFiltersCommand.Execute(null);
                }
                else
                {
                    await ApplyFilters();
                }

                RaisePropertyChanged(nameof(CanFilterByEclipse));
                RaisePropertyChanged(nameof(CanFilterByScales));
                RaisePropertyChanged(nameof(CanFilterByStrife));
                RaisePropertyChanged(nameof(CanFilterByThorns));
                RaisePropertyChanged(nameof(CanFilterBySilence));
                RaisePropertyChanged(nameof(CanFilterByEssence));
                RaisePropertyChanged(nameof(CanFilterByDelirium));
                RaisePropertyChanged(nameof(CanFilterByEighth));
            }
            else
            {
                AllCards      = _unfilteredCards?.ToList();
                FilteredCards = AllCards;

                CanFilterByEclipse  = true;
                CanFilterByScales   = true;
                CanFilterByStrife   = true;
                CanFilterByThorns   = true;
                CanFilterBySilence  = true;
                CanFilterByEssence  = true;
                CanFilterByDelirium = true;
                CanFilterByEighth   = true;
                FilterByDeck        = false;

                if (ResetFiltersCommand.CanExecute(null))
                {
                    ResetFiltersCommand.Execute(null);
                }
                else
                {
                    await ApplyFilters();
                }
            }
        }