package crazypants.enderio.machine.invpanel.client;
import crazypants.enderio.conduit.item.filter.IItemFilter;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Locale;
import net.minecraft.client.Minecraft;
public class DatabaseView {
public static final Locale LOCALE;
static {
String languageCode = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode();
int idx = languageCode.indexOf('_');
if(idx > 0) {
String lang = languageCode.substring(0, idx);
String country = languageCode.substring(idx+1);
LOCALE = new Locale(lang, country);
} else {
LOCALE = new Locale(languageCode);
}
}
private final ArrayList<ItemEntry> filteredItems;
private InventoryDatabaseClient database;
private int dbItemsChangeCount;
private int dbCountChangeCount;
private SortOrder order = SortOrder.NAME;
private boolean invertSortOrder;
private boolean needsSorting;
private IItemFilter itemFilter;
private String currentFilter;
private boolean needsFiltering;
private boolean needsNewFiltering;
private final Collator collator;
public DatabaseView() {
filteredItems = new ArrayList<ItemEntry>();
currentFilter = "";
collator = Collator.getInstance(LOCALE);
}
public void setDatabase(InventoryDatabaseClient database) {
if(this.database != database) {
this.database = database;
if(database != null) {
this.dbItemsChangeCount = database.getItemsChangeCount();
this.dbCountChangeCount = database.getCountChangeCount();
}
this.needsSorting = true;
this.needsFiltering = true;
this.needsNewFiltering = true;
}
}
public void setSortOrder(SortOrder order, boolean invert) {
if(this.order != order || this.invertSortOrder != invert) {
this.order = order;
this.invertSortOrder = invert;
this.needsSorting = true;
}
}
public void setItemFilter(IItemFilter itemFilter) {
if(this.itemFilter != itemFilter) {
this.itemFilter = itemFilter;
needsNewFiltering = true;
needsFiltering = true;
}
}
public void updateFilter(String newFilter) {
newFilter = newFilter.trim();
if(!currentFilter.equals(newFilter)) {
if(newFilter.length() < currentFilter.length() ||
!newFilter.regionMatches(0, currentFilter, 0, currentFilter.length())) {
needsNewFiltering = true;
}
needsFiltering = true;
currentFilter = newFilter;
}
}
public SortOrder getSortOrder() {
return order;
}
public boolean isSortOrderInverted() {
return invertSortOrder;
}
public boolean sortItems() {
boolean changed = false;
if(database != null) {
if(dbItemsChangeCount != database.getItemsChangeCount()) {
dbItemsChangeCount = database.getItemsChangeCount();
needsSorting = true;
needsFiltering = true;
needsNewFiltering = true;
}
if(dbCountChangeCount != database.getCountChangeCount()) {
dbCountChangeCount = database.getCountChangeCount();
if(order == SortOrder.COUNT) {
needsSorting = true;
}
}
}
if(needsFiltering) {
if(needsNewFiltering) {
filteredItems.clear();
if(database != null) {
database.getItems(filteredItems);
}
needsSorting = true;
}
ItemFilter filter = ItemFilter.parse(currentFilter, LOCALE, itemFilter);
if(filter != null) {
Iterator<ItemEntry> iter = filteredItems.iterator();
while(iter.hasNext()) {
ItemEntry entry = iter.next();
if(!filter.matches(entry)) {
iter.remove();
changed = true;
}
}
}
needsFiltering = false;
needsNewFiltering = false;
}
if(needsSorting) {
Comparator<ItemEntry> cmp;
switch (order) {
case NAME: cmp = new NameComparator(collator); break;
case MOD: cmp = new ModComparator(collator); break;
default: cmp = new CountComparator(collator); break;
}
if(invertSortOrder) {
cmp = Collections.reverseOrder(cmp);
}
Collections.sort(filteredItems, cmp);
changed = true;
needsSorting = false;
}
return changed;
}
public int getNumEntries() {
return filteredItems.size();
}
public ItemEntry getItemEntry(int index) {
return filteredItems.get(index);
}
}