package crazypants.enderio.machine.invpanel.client;
import crazypants.enderio.conduit.item.filter.IItemFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import java.util.regex.Pattern;
public abstract class ItemFilter {
private static final Pattern SPLIT_PATTERN = Pattern.compile("\\s+");
public abstract boolean matches(ItemEntry entry);
public static ItemFilter parse(String filter, Locale locale, IItemFilter filterCard) {
ArrayList<ItemFilter> list = new ArrayList<ItemFilter>();
if(filterCard != null) {
list.add(new CardFilter(filterCard));
}
String[] parts = SPLIT_PATTERN.split(filter);
for(String part : parts) {
if(part.startsWith("@")) {
part = part.substring(1);
if(!part.isEmpty()) {
list.add(new ModFilter(part, locale));
}
} else if(!part.isEmpty()) {
list.add(new NameFilter(part, locale));
}
}
if(list.isEmpty()) {
return null;
}
if(list.size() == 1) {
return list.get(0);
}
return new AndFilter(list.toArray(new ItemFilter[list.size()]));
}
static class AndFilter extends ItemFilter {
final ItemFilter[] list;
AndFilter(ItemFilter[] list) {
this.list = list;
}
@Override
public boolean matches(ItemEntry entry) {
for(ItemFilter f : list) {
if(!f.matches(entry)) {
return false;
}
}
return true;
}
@Override
public String toString() {
return Arrays.deepToString(list);
}
}
static class ModFilter extends ItemFilter {
final String text;
final Locale locale;
ModFilter(String text, Locale locale) {
this.text = text.toLowerCase(locale);
this.locale = locale;
}
@Override
public boolean matches(ItemEntry entry) {
return entry.getModId().toLowerCase(locale).contains(text);
}
@Override
public String toString() {
return "@" + text;
}
}
static class NameFilter extends ItemFilter {
final String text;
final Locale locale;
NameFilter(String text, Locale locale) {
this.text = text.toLowerCase(locale);
this.locale = locale;
}
@Override
public boolean matches(ItemEntry entry) {
return entry.getLowercaseUnlocName(locale).contains(text);
}
@Override
public String toString() {
return text;
}
}
static class CardFilter extends ItemFilter {
final IItemFilter filter;
CardFilter(IItemFilter filter) {
this.filter = filter;
}
@Override
public boolean matches(ItemEntry entry) {
return filter.doesItemPassFilter(null, entry.makeItemStack());
}
}
}