package joshie.progression.gui.editors;
import joshie.progression.api.ProgressionAPI;
import joshie.progression.api.criteria.ICriteria;
import joshie.progression.api.criteria.IField;
import joshie.progression.api.criteria.IRewardProvider;
import joshie.progression.api.criteria.ITriggerProvider;
import joshie.progression.api.gui.Position;
import joshie.progression.gui.core.IBarProvider;
import joshie.progression.gui.editors.TreeEditorElement.ColorMode;
import joshie.progression.gui.fields.TextFieldHideable;
import joshie.progression.gui.filters.FilterTypeItem;
import joshie.progression.handlers.APICache;
import joshie.progression.handlers.TemplateHandler;
import joshie.progression.helpers.AchievementHelper;
import joshie.progression.helpers.FileHelper;
import joshie.progression.json.JSONLoader;
import joshie.progression.json.Options;
import net.minecraft.item.ItemStack;
import java.util.UUID;
import static joshie.progression.Progression.format;
import static joshie.progression.Progression.translate;
import static joshie.progression.api.special.DisplayMode.DISPLAY;
import static joshie.progression.api.special.DisplayMode.EDIT;
import static joshie.progression.gui.core.GuiList.*;
import static net.minecraft.util.text.TextFormatting.BOLD;
import static net.minecraft.util.text.TextFormatting.ITALIC;
public class GuiCriteriaEditor extends GuiBaseEditorRule<ICriteria> implements IBarProvider, IItemSelectable, IEditorMode {
//The uuid of the criteria
private UUID uuid;
//Fields
private IField name;
private IField popup;
private IField rewards;
private IField tasks;
private IField repeat;
public GuiCriteriaEditor() {
features.add(BACKGROUND);
features.add(TRIGGERS);
features.add(REWARDS);
features.add(CRITERIA_BG);
features.add(TEXT_EDITOR_FULL); //Add the text selector
features.add(ITEM_EDITOR); //Add the item selector
features.add(NEW_TRIGGER); //Add new trigger popup
features.add(NEW_REWARD); //Add new reward popup
features.add(FOOTER);
}
@Override
public ICriteria get() {
return APICache.getClientCache().getCriteria(uuid);
}
@Override
public void set(ICriteria criteria) {
this.uuid = criteria.getUniqueID();
}
@Override
public IEditorMode getPreviousGui() {
return TREE_EDITOR;
}
@Override
public void initData() {
ICriteria criteria = get();
if (criteria == null) {
CORE.setEditor(TREE_EDITOR);
return;
}
//Reload the criteria from the cache
//Setup the features
REWARDS.reset(criteria);
CRITERIA_BG.setProvider(this);
name = ProgressionAPI.fields.getText(criteria, "displayName");
rewards = ProgressionAPI.fields.getToggleBoolean(criteria, "allRewards", "rewardsGiven");
tasks = ProgressionAPI.fields.getToggleBoolean(criteria, "allTasks", "tasksRequired");
repeat = ProgressionAPI.fields.getToggleBoolean(criteria, "infinite", "isRepeatable");
if (MODE == EDIT) {
popup = ProgressionAPI.fields.getBoolean(criteria, "achievement");
}
}
private boolean returnedBoolean(IField field) {
return !((TextFieldHideable)field).isVisible();
}
public String translateCriteria(String s) {
return translate("criteria." + s);
}
private void addCriteriaTooltip(String s) {
if (!Options.hideTooltips) {
addTooltip(BOLD + translateCriteria(s));
addTooltip(translateCriteria(s + ".tooltip"), 30);
}
}
private boolean clickHeader(int mouseLeft, int mouseRight, int mouseY, int button) {
if (mouseY >= 8 && mouseY <= 18) {
if (mouseRight >= 175 && mouseRight <= 240) {
if(TemplateHandler.registerCriteria(JSONLoader.getDataCriteriaFromCriteria(get()))) {
JSONLoader.saveJSON(FileHelper.getTemplatesFolder("criteria", get().getLocalisedName() + "_" + get().getUniqueID()), JSONLoader.getDataCriteriaFromCriteria(get()), true, false);
AchievementHelper.display(get().getIcon(), "Saved " + get().getLocalisedName());
}
}
if (mouseRight >= 100 && mouseRight <= 170) {
return popup.click(button);
} else if (mouseRight >= 10 && mouseRight <= 90) {
return repeat.click(button);
}
if (mouseLeft <= 170 && mouseLeft > 20) {
return name.click(button);
} else if (mouseLeft > 0 && mouseLeft < 18 && mouseY >= 4 && mouseY <= 20) {
return ITEM_EDITOR.select(FilterTypeItem.INSTANCE, this, Position.TOP);
}
}
if (mouseLeft >= 140 && mouseLeft <= 240) {
if (mouseY >= 26 && mouseY <= 36) {
return tasks.click(button);
} else if (mouseY >= 123 && mouseY <= 133) {
return rewards.click(button);
}
}
return false;
}
private void drawHeader(ICriteria criteria, boolean overlay, int mouseX, int mouseY) {
String displayName = MODE == EDIT ? translate("name.display") + ": " + name : name.toString();
drawText(displayName, 21, 9, THEME.criteriaEditDisplayNameColor);
drawStack(criteria.getIcon(), 1, 4, 1F);
if (MODE == EDIT) drawText(translate("popup") + ": " + popup, CORE.screenWidth - 170, 9, THEME.criteriaEditDisplayNameColor);
if (MODE == EDIT) drawText(translate("criteria.save"), CORE.screenWidth - 270, 9, THEME.criteriaEditDisplayNameColor);
drawText(translate("repeat") + ": " + (returnedBoolean(repeat) ? repeat : repeat + "x"), CORE.screenWidth - 90, 9, THEME.criteriaEditDisplayNameColor);
if (!overlay && mouseY >= 4 && mouseY <= 20) {
if (mouseY >= 8 && mouseY <= 18) {
if (mouseX >= 100 && mouseX <= 90) {
addCriteriaTooltip("repeat"); //Tooltip for repeatability
if (returnedBoolean(repeat)) addTooltip(ITALIC + " " + translateCriteria("repeat.infinite"));
else addTooltip(ITALIC + " " + translateCriteria("repeat.numbers"));
} else if (MODE == EDIT && mouseX >= 100 && mouseX <= 170) {
addCriteriaTooltip("popup"); //Tooltip for popup
} else if (MODE == EDIT && mouseX >= 200 && mouseX <= 270) {
addCriteriaTooltip("save");
}
}
//Add the tooltip for the icon
if (mouseX > 0 && mouseX < 18) {
addTooltip(BOLD + "" + translateCriteria("icon"));
addTooltip(ITALIC + " " + translateCriteria("icon.tooltip"));
}
}
}
private boolean clickTriggers(int mouseX, int mouseY, int button) {
return mouseX >= 100 && mouseX <= 175 && mouseY >= 26 && mouseY <= 36 ? tasks.click(button) : false;
}
public boolean isCompleted() {
for (ITriggerProvider trigger: get().getTriggers()) {
if (!trigger.getProvided().isCompleted()) return false;
}
return true;
}
private void drawTriggers(boolean overlay, int mouseX, int mouseY) {
if (MODE == EDIT) {
drawText(translate("required") + ": " + tasks.getField(), 100, 29, THEME.criteriaEditDisplayNameColor);
if (!overlay) {
if (mouseX >= 100 && mouseX <= 175 && mouseY >= 26 && mouseY <= 36) {
addCriteriaTooltip("tasks");
if (returnedBoolean(tasks)) addTooltip(ITALIC + " " + translateCriteria("tasks.all"));
else addTooltip(ITALIC + " " + translateCriteria("tasks.amount"));
}
}
} else {
if(isCompleted()) drawText(translate("criteria.tasks.completed"), 140, 29, THEME.criteriaEditDisplayNameColor);
else if (returnedBoolean(tasks)) drawText(translate("required.all.display"), 140, 29, THEME.criteriaEditDisplayNameColor);
else drawText(format("required.amount.display", tasks.getField()), 140, 29, THEME.criteriaEditDisplayNameColor);
}
}
private boolean clickRewards(int mouseX, int mouseY, int button) {
return mouseX >= 100 && mouseX <= 175 && mouseY >= 123 && mouseY <= 133 ? rewards.click(button) : false;
}
private void drawRewards(ICriteria criteria, boolean overlay, int mouseX, int mouseY) {
//Universal Mode
if (MODE == EDIT) {
drawText(translate("given") + ": " + rewards.getField(), 100, 124, THEME.criteriaEditDisplayNameColor);
if (!overlay) {
if (mouseX >= 100 && mouseX <= 175 && mouseY >= 123 && mouseY <= 133) {
addCriteriaTooltip("rewards");
if (returnedBoolean(rewards)) addTooltip(ITALIC + " " + translateCriteria("rewards.all"));
else addTooltip(ITALIC + " " + translateCriteria("rewards.amount"));
}
}
} else if (TreeEditorElement.getModeForCriteria(criteria, false) != ColorMode.COMPLETED) {
for (ITriggerProvider provider: get().getTriggers()) {
if (!provider.getProvided().isCompleted()) return; //Don't continue processing if we can't claim any rewards
}
int maximum = criteria.givesAllRewards() ? criteria.getRewards().size(): criteria.getAmountOfRewards();
int standard = 0;
for (IRewardProvider reward: criteria.getRewards()) {
if (!reward.mustClaim()) standard++;
}
int current = REWARDS.getSelected().size() + standard;
int number = maximum - current;
if (number > 0) {
drawText("Please Select " + number + " Rewards", 140, 124, 0xFFFFFFFF);
}
}
}
@Override
public void drawGuiForeground(boolean overlayvisible, int mouseX, int mouseY) {
ICriteria criteria = get();
if (criteria == null) return; //Don't draw if no criteria!
drawHeader(criteria, overlayvisible, CORE.screenWidth - mouseX, mouseY);
drawTriggers(overlayvisible, mouseX, mouseY);
drawRewards(criteria, overlayvisible, mouseX, mouseY);
}
@Override
public boolean guiMouseClicked(boolean overlayvisible, int mouseLeft, int mouseY, int button) {
if (MODE == DISPLAY || overlayvisible) return false;
if (clickHeader(mouseLeft, CORE.screenWidth - mouseLeft, mouseY, button)) return true;
if (clickTriggers(mouseLeft, mouseY, button)) return true;
if (clickRewards(mouseLeft, mouseY, button)) return true;
else return false;
}
@Override
public void setObject(Object object) {
get().setIcon((ItemStack) object);
}
@Override
public int getColorForBar(BarColorType type) {
switch (type) {
case BAR1_GRADIENT1:
return THEME.triggerBoxGradient1;
case BAR1_GRADIENT2:
return THEME.triggerBoxGradient2;
case BAR1_BORDER:
return THEME.triggerBoxUnderline1;
case BAR1_FONT:
return THEME.triggerBoxFont;
case BAR1_UNDERLINE:
return THEME.triggerBoxUnderline1;
case BAR2_GRADIENT1:
return THEME.rewardBoxGradient1;
case BAR2_GRADIENT2:
return THEME.rewardBoxGradient2;
case BAR2_BORDER:
return THEME.rewardBoxBorder;
case BAR2_FONT:
return THEME.rewardBoxFont;
default:
return 0;
}
}
}