package joshie.progression.plugins.enchiridion.features;
import com.google.gson.JsonObject;
import joshie.enchiridion.api.EnchiridionAPI;
import joshie.enchiridion.api.book.IFeatureProvider;
import joshie.enchiridion.api.gui.ISimpleEditorFieldProvider;
import joshie.progression.api.criteria.ICriteria;
import joshie.progression.api.criteria.ITab;
import joshie.progression.handlers.APICache;
import joshie.progression.helpers.JSONHelper;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static joshie.progression.plugins.enchiridion.features.FeatureTab.addCriteriaToPage;
public class FeatureTabUpdater extends FeatureProgression implements ISimpleEditorFieldProvider {
private transient UUID uuid;
public FeatureTabUpdater() {}
public FeatureTabUpdater(UUID uuid) {
this.uuid = uuid;
}
@Override
public FeatureTabUpdater copy() {
return new FeatureTabUpdater(uuid);
}
@Override
public String getName() {
return "Tab Updater";
}
private boolean pageContainsCriteria(ICriteria criteria) {
for (IFeatureProvider feature: position.getPage().getFeatures()) {
if (feature.getFeature() instanceof FeatureCriteria) {
FeatureCriteria c = ((FeatureCriteria) feature.getFeature());
if (c.uuid != null && criteria.getUniqueID().equals(c.uuid)) {
return true;
}
}
}
return false;
}
private boolean tabContainsCriteria(ITab tab, UUID uuid) {
for (ICriteria c: tab.getCriteria()) {
if (c.getUniqueID().equals(uuid)) return true;
}
return false;
}
@Override
public void draw(int mouseX, int mouseY) {
if (!EnchiridionAPI.book.isEditMode()) return; //Don't update outside of edit mode
ITab tab = APICache.getClientCache().getTab(uuid);
if (tab != null) {
//Update and add new criteria from the page
for (ICriteria criteria: tab.getCriteria()) {
if (!pageContainsCriteria(criteria)) {
addCriteriaToPage(position.getPage(), criteria);
}
}
//Update and remove criteria that aren't supposed to be here
List<IFeatureProvider> list = new ArrayList<IFeatureProvider>();
for (IFeatureProvider feature: position.getPage().getFeatures()) {
if (feature.getFeature() instanceof FeatureCriteria) {
FeatureCriteria c = ((FeatureCriteria) feature.getFeature());
if (c.getCriteria() == null || !tabContainsCriteria(tab, c.uuid)) {
list.add(feature);
}
}
}
for (IFeatureProvider provider: list) {
EnchiridionAPI.book.getPage().removeFeature(provider);
}
}
//Update everything
for (IFeatureProvider provider: position.getPage().getFeatures()) {
provider.getFeature().update(provider);
}
}
@Override
public void readFromJson(JsonObject object) {
try {
uuid = UUID.fromString(JSONHelper.getString(object, "uuid", "d977334a-a7e9-5e43-b87e-91df8eebfdff"));
} catch (Exception e){}
}
@Override
public void writeToJson(JsonObject object) {
if (uuid != null) {
JSONHelper.setString(object, "uuid", uuid.toString(), "d977334a-a7e9-5e43-b87e-91df8eebfdff");
}
}
}