package magic.ui.widget.deck; import magic.model.MagicDeck; import magic.translate.MText; public class DeckFilter { // translatable strings private static final String _S1 = "any"; private static final String _S2 = "equals"; private static final String _S3 = "less than"; private static final String _S4 = "greater than"; private static final String _S5 = "between"; public enum NumericFilter { Any(MText.get(_S1)), Equals(MText.get(_S2), 1), LessThan(MText.get(_S3), 1), GreaterThan(MText.get(_S4), 1), Between(MText.get(_S5), 2) ; private final String filterCaption; private final int spinnersRequired; private NumericFilter(String caption, int spinnersRequired) { this.filterCaption = caption; this.spinnersRequired = spinnersRequired; } private NumericFilter(final String caption) { this(caption, 0); } @Override public String toString() { return filterCaption; } public int getSpinnersRequired() { return spinnersRequired; } } private NumericFilter deckSizeFilter = NumericFilter.Any; private int deckSizeFilterValue1 = 40; private int deckSizeFilterValue2 = 60; private String deckNameFilterText = ""; private String deckDescFilterText = ""; private String cardNameFilterText = ""; public DeckFilter(final DeckFilter filter) { if (filter != null) { deckSizeFilter = filter.getDeckSizeFilterType(); deckSizeFilterValue1 = filter.getDeckSizeFilterValue1(); deckSizeFilterValue2 = filter.getDeckSizeFilterValue2(); deckNameFilterText = filter.getDeckNameFilterText(); deckDescFilterText = filter.getDeckDescFilterText(); cardNameFilterText = filter.getCardNameFilterText(); } } public DeckFilter() { this(null); } public boolean isDeckValid(final MagicDeck deck) { if (!isDeckSizeValid(deck)) { return false; } if (!isDeckNameValid(deck)) { return false; } if (!isDeckDescValid(deck)) { return false; } if (!isCardInDeck(deck)) { return false; } return true; } private boolean isDeckDescValid(final MagicDeck deck) { final String searchText = deckDescFilterText.trim(); return deck.getDescription() != null && deck.getDescription().toLowerCase().contains(searchText); } private boolean isDeckNameValid(final MagicDeck deck) { final String searchText = deckNameFilterText.trim(); return deck.getName().toLowerCase().contains(searchText); } private boolean isCardInDeck(final MagicDeck deck) { final String searchText = cardNameFilterText.trim().toLowerCase(); return deck.stream().anyMatch(card -> card.getName().toLowerCase().contains(searchText) ); } private boolean isDeckSizeValid(final MagicDeck deck) { if (deckSizeFilter != NumericFilter.Any) { switch (deckSizeFilter) { case Equals: return deck.size() == deckSizeFilterValue1; case GreaterThan: return deck.size() > deckSizeFilterValue1; case LessThan: return deck.size() < deckSizeFilterValue1; case Between: return (deck.size() >= deckSizeFilterValue1) && (deck.size() <= deckSizeFilterValue2); default: throw new RuntimeException("Unhandled deck size filter: " + deckSizeFilter); } } else { return true; } } public void setDeckSizeFilterValues(final NumericFilter filter, final int filterValue1, final int filterValue2) { this.deckSizeFilter = filter; this.deckSizeFilterValue1 = filterValue1; this.deckSizeFilterValue2 = filterValue2; } public NumericFilter getDeckSizeFilterType() { return deckSizeFilter; } public int getDeckSizeFilterValue1() { return deckSizeFilterValue1; } public int getDeckSizeFilterValue2() { return deckSizeFilterValue2; } public String getCardNameFilterText() { return cardNameFilterText; } public void setCardNameFilterText(String filterText) { this.cardNameFilterText = filterText; } public String getDeckNameFilterText() { return deckNameFilterText; } public void setDeckNameFilterText(String filterText) { this.deckNameFilterText = filterText; } public String getDeckDescFilterText() { return deckDescFilterText; } public void setDeckDescFilterText(String filterText) { this.deckDescFilterText = filterText; } }