package joshie.progression.gui.fields;
import joshie.progression.Progression;
import joshie.progression.api.criteria.IFilter;
import joshie.progression.api.criteria.IFilterProvider;
import joshie.progression.api.criteria.IFilterType;
import joshie.progression.api.criteria.IRuleProvider;
import joshie.progression.api.gui.IDrawHelper;
import joshie.progression.api.special.IHasFilters;
import joshie.progression.api.special.IInit;
import joshie.progression.api.special.ISetterCallback;
import joshie.progression.gui.filters.FilterTypeItem;
import joshie.progression.helpers.CollectionHelper;
import net.minecraft.client.gui.GuiScreen;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import static joshie.progression.api.special.DisplayMode.EDIT;
import static joshie.progression.gui.core.GuiList.*;
public class ItemFilterField extends AbstractField {
private static final Random rand = new Random();
private IFilterType selector;
private Field field;
public ItemFilterField(String fieldName, Object object) {
super(fieldName);
this.object = object;
try {
field = object.getClass().getField(fieldName);
} catch (Exception e) {
try {
field = object.getClass().getSuperclass().getField(fieldName);
} catch (Exception e1) {}
}
if (object instanceof IHasFilters) {
selector = ((IHasFilters) object).getFilterForField(getFieldName());
} else if (object instanceof IFilter) {
selector = ((IFilter)object).getType();
} else selector = FilterTypeItem.INSTANCE;
}
@Override
public String getFieldName() {
return field.getName();
}
private transient int ticker = 0;
private transient String name;
public IFilterProvider getRandomFilter() {
List<IFilterProvider> filters = getFilters();
int size = filters.size();
if (size == 0) return null;
if (size == 1) return filters.get(0);
else {
return filters.get(rand.nextInt(size));
}
}
@Override
public String getField() {
if (ticker %200 == 0) {
IFilterProvider filter = getRandomFilter();
if (filter == null) name = null;
else name = filter.getDescription();
}
if (!GuiScreen.isShiftKeyDown()) ticker++;
return name == null ? "No Valid Filter Set" : name;
}
@Override
public void draw(IRuleProvider provider, IDrawHelper helper, int renderX, int renderY, int color, int yPos, int mouseX, int mouseY) {
if (MODE == EDIT) {
helper.drawSplitText(renderX, renderY, Progression.translate("filter." + selector.getName()), 4, yPos, 105, color, 0.75F);
}
}
public boolean isAccepted(IFilterProvider filter) {
if (filter.getProvided().getType() != selector) return false;
return true;
}
@Override
public boolean click() {
try {
FILTER_EDITOR.setPrevious(CORE.openGui).set(this); //Adjust this filter object
PREVIEW.select(selector); //Allow for selection of multiple items
CORE.setEditor(FILTER_EDITOR);
return true;
} catch (Exception e) {
return false;
}
}
@Override
public boolean attemptClick(int mouseX, int mouseY) {
return false;
}
public void setFilters(List<IFilterProvider> filters) {
try {
if (object instanceof ISetterCallback) {
((ISetterCallback) object).setField(field.getName(), filters);
} else field.set(object, filters);
//Init the object after we've set it
if (object instanceof IInit) {
((IInit) object).init(true);
}
//Update
PREVIEW.updateSearch();
} catch (Exception e) {}
}
public List<IFilterProvider> getFilters() {
try {
return (List<IFilterProvider>) field.get(object);
} catch (Exception e) {}
//Return a blank list yo!
return new ArrayList();
}
public void add(IFilterProvider filter) {
List<IFilterProvider> filters = getFilters();
filters.add(filter);
if (object instanceof ISetterCallback) {
((ISetterCallback) object).setField(field.getName(), filters);
}
//Call this on init objects
if (object instanceof IInit) {
((IInit) object).init(true);
}
//Update
PREVIEW.updateSearch();
}
public void remove(IFilterProvider filter) {
List<IFilterProvider> filters = getFilters();
CollectionHelper.remove(filters, filter);
if (object instanceof ISetterCallback) {
((ISetterCallback) object).setField(field.getName(), filters);
}
//Call this on init objects
if (object instanceof IInit) {
((IInit) object).init(true);
}
//Update
PREVIEW.updateSearch();
}
}