package joshie.progression.plugins.enchiridion.features;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import joshie.enchiridion.api.EnchiridionAPI;
import joshie.enchiridion.api.book.IButtonActionProvider;
import joshie.enchiridion.api.book.IFeatureProvider;
import joshie.enchiridion.api.book.IPage;
import joshie.enchiridion.gui.book.features.FeatureButton;
import joshie.enchiridion.gui.book.features.FeaturePreviewWindow;
import joshie.enchiridion.util.ELocation;
import joshie.progression.api.ProgressionAPI;
import joshie.progression.api.criteria.ICriteria;
import joshie.progression.api.criteria.ITab;
import joshie.progression.gui.editors.GuiTreeEditor;
import joshie.progression.handlers.APICache;
import joshie.progression.helpers.PlayerHelper;
import joshie.progression.plugins.enchiridion.actions.ActionJumpTab;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import static joshie.progression.plugins.enchiridion.EnchiridionSupport.TRANSPARENT;
public class FeatureTab extends FeatureTabGeneric {
private static final Cache<UUID, Integer> numberCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).build();
protected transient boolean isSelected = false;
public int pageNumber = 0;
public FeatureTab() {}
public FeatureTab(ITab tab) {
if (tab != null) {
uuid = tab.getUniqueID();
display = tab.getLocalisedName();
pageNumber = uuid.hashCode();
}
}
@Override
public FeatureTab copy() {
return new FeatureTab(getTab());
}
@Override
public void onFieldsSet(String field) {
super.onFieldsSet(field);
if (field.equals("")) { //If we're performing init
for (IFeatureProvider feature: EnchiridionAPI.book.getPage().getFeatures()) {
if (feature.getFeature() instanceof FeatureButton) {
FeatureButton button = (FeatureButton)(feature.getFeature());
if (button.getAction() instanceof ActionJumpTab) {
ActionJumpTab jump = ((ActionJumpTab)button.getAction());
if (!jump.init) {
button.setTooltip("Open " + APICache.getClientCache().getSortedTabs().get(0).getLocalisedName());
jump.tempPage = pageNumber;
jump.init = true;
}
break; //Don't continue
}
}
}
}
}
public int getTabNumber(final ITab tab) {
try {
return numberCache.get(tab.getUniqueID(), new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int number = 1;
for (ITab t : APICache.getCache(true).getSortedTabs()) {
if (t.getUniqueID().equals(tab.getUniqueID())) return number;
number++;
}
return 0;
}
});
} catch (Exception e) { return 0; }
}
public int getCompletionAmount(ITab tab) {
int totaltasks = tab.getCriteria().size();
if (totaltasks == 0) return 100;
Set<ICriteria> completed = ProgressionAPI.player.getCompletedCriteriaList(PlayerHelper.getClientUUID(), true);
int tasksdone = 0;
for (ICriteria criteria: completed) {
if (tab.equals(criteria.getTab())) tasksdone++;
}
return (tasksdone * 100) / totaltasks;
}
public static void addCriteriaToPage(IPage page, ICriteria criteria) {
FeatureCriteria feature = new FeatureCriteria(criteria, true);
page.addFeature(feature, new Random().nextInt(400), new Random().nextInt(200), 16, 16, false, false);
// ^ Put the stuff in a random position :D
}
@Override
public boolean performClick(int mouseX, int mouseY, int mouseButton) {
ITab tab = getTab();
if (tab != null) {
if (mouseX >= position.getLeft() && mouseX <= position.getRight()) {
if (mouseY >= position.getTop() && mouseY <= position.getBottom()) {
IPage page = EnchiridionAPI.book.getPageIfNotExists(pageNumber);
if (page != null) {
//Add the back button
IButtonActionProvider button = EnchiridionAPI.editor.getJumpPageButton(EnchiridionAPI.book.getPage().getPageNumber());
button.setResourceLocation(true, new ELocation("arrow_left_on")).setResourceLocation(false, new ELocation("arrow_left_off"));
page.addFeature(button, 21, 200, 18, 10, true, false);
//Add the criteria
for (ICriteria c: tab.getCriteria()) {
addCriteriaToPage(page, c);
}
//Return to this tab page
IButtonActionProvider pageBack = EnchiridionAPI.editor.getJumpPageButton(EnchiridionAPI.book.getPage().getPageNumber());
pageBack.setResourceLocation(true, TRANSPARENT).setResourceLocation(false, TRANSPARENT);
pageBack.setProcessesClick(0, false);
page.addFeature(pageBack, -10, -10, 450, 250, true, false);
//Add the autoupdater
FeatureTabUpdater updater = new FeatureTabUpdater(tab.getUniqueID());
page.addFeature(updater, -250, -250, 1, 1, true, false);
}
for (IFeatureProvider feature: EnchiridionAPI.book.getPage().getFeatures()) {
if (feature.getFeature() instanceof FeaturePreviewWindow) {
FeaturePreviewWindow window = ((FeaturePreviewWindow)feature.getFeature());
if (window.pageNumber > 10 || window.pageNumber < 0) {
window.pageNumber = pageNumber + 1; //Update the preview text to the description
window.update(feature);
}
} else if (feature.getFeature() instanceof FeatureTabInfo) {
((FeatureTabInfo)feature.getFeature()).uuid = tab.getUniqueID(); //Change the tab being displayed to this one
} else if (feature.getFeature() instanceof FeatureButton) {
FeatureButton button = (FeatureButton)(feature.getFeature());
if (button.getAction() instanceof ActionJumpTab) {
button.setTooltip("Open " + tab.getLocalisedName());
((ActionJumpTab) button.getAction()).tempPage = pageNumber;
}
}
}
for (IFeatureProvider feature: position.getPage().getFeatures()) {
if (feature.getFeature() instanceof FeatureTab) {
((FeatureTab)feature.getFeature()).isSelected = false;
}
}
isSelected = true;
return true;
}
}
}
return false;
}
@Override
public void drawFeature(int mouseX, int mouseY) {
int color = 0xFF404040;
if (mouseX >= position.getLeft() && mouseX <= position.getRight()) {
if (mouseY>= position.getTop() && mouseY <= position.getBottom()) {
color = 0xFFAAAAAA;
}
}
if (isSelected) color = 0xFF7C7C7C;
ITab tab = getTab();
if (tab != null) {
String completion = getCompletionAmount(tab) + "% Completed";
if (!GuiTreeEditor.isTabVisible(tab)) {
completion = "Invisible";
color = 0xFFCCCCCC;
}
EnchiridionAPI.draw.drawSplitScaledString(getTabNumber(tab) + ".", position.getLeft(), position.getTop(), 200, color, 1F);
EnchiridionAPI.draw.drawSplitScaledString(tab.getLocalisedName(), position.getLeft() + 12, position.getTop(), 200, color, 1F);
EnchiridionAPI.draw.drawSplitScaledString(completion, position.getLeft() + 9, position.getTop() + 10, 100, color, 0.75F);
}
}
}