package codechicken.nei.recipe;
import codechicken.core.TaskProfiler;
import codechicken.core.TaskProfiler.ProfilerResult;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
import codechicken.nei.PositionedStack;
import codechicken.nei.api.IOverlayHandler;
import codechicken.nei.api.IRecipeOverlayRenderer;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import java.text.DecimalFormat;
import java.util.*;
import static codechicken.lib.gui.GuiDraw.drawString;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
public class ProfilerRecipeHandler implements ICraftingHandler, IUsageHandler {
private static TaskProfiler profiler = new TaskProfiler();
public static TaskProfiler getProfiler() {
profiler.clear();
return profiler;
}
private boolean crafting;
public ProfilerRecipeHandler(boolean crafting) {
this.crafting = crafting;
}
@Override
public String getRecipeName() {
return NEIClientUtils.translate("recipe.profiler." + (crafting ? "crafting" : "usage"));
}
@Override
public int numRecipes() {
if (!NEIClientConfig.getBooleanSetting("inventory.profileRecipes")) {
return 0;
}
return (int) Math.ceil(((crafting ? GuiCraftingRecipe.craftinghandlers.size() : GuiUsageRecipe.usagehandlers.size()) - 1) / 6D);
}
@Override
public void drawBackground(int recipe) {
}
@Override
public void drawForeground(int recipe) {
List<ProfilerResult> results = profiler.getResults();
for (Iterator<ProfilerResult> it = results.iterator(); it.hasNext(); ) {
if (it.next().name.equals(getRecipeName())) {
it.remove();
}
}
Collections.sort(results, new Comparator<ProfilerResult>() {
@Override
public int compare(ProfilerResult o1, ProfilerResult o2) {
return o1.time < o2.time ? 1 : -1;
}
});
for (int i = recipe * 6; i < results.size() && i < (recipe + 1) * 6; i++) {
ProfilerResult r = results.get(i);
int y = (i % 6) * 20 + 6;
drawString(r.name, 8, y, 0xFF808080, false);
DecimalFormat format = new DecimalFormat("0.00");
String s = format.format(r.fraction * 100) + "%";
if (r.time < 1000000L) {
s += " (" + (r.time / 1000) + "us)";
} else {
s += " (" + (r.time / 1000000) + "ms)";
}
drawString(s, 156 - getStringWidth(s), y + 10, 0xFF404040, false);
}
}
@Override
public ArrayList<PositionedStack> getIngredientStacks(int recipe) {
return new ArrayList<PositionedStack>();
}
@Override
public ArrayList<PositionedStack> getOtherStacks(int recipetype) {
return new ArrayList<PositionedStack>();
}
@Override
public PositionedStack getResultStack(int recipe) {
return null;
}
@Override
public void onUpdate() {
}
@Override
public boolean hasOverlay(GuiContainer gui, Container container, int recipe) {
return false;
}
@Override
public IRecipeOverlayRenderer getOverlayRenderer(GuiContainer gui, int recipe) {
return null;
}
@Override
public IOverlayHandler getOverlayHandler(GuiContainer gui, int recipe) {
return null;
}
@Override
public int recipiesPerPage() {
return 1;
}
@Override
public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe) {
return currenttip;
}
@Override
public List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe) {
return currenttip;
}
@Override
public boolean keyTyped(GuiRecipe gui, char keyChar, int keyCode, int recipe) {
return false;
}
@Override
public boolean mouseClicked(GuiRecipe gui, int button, int recipe) {
return false;
}
@Override
public IUsageHandler getUsageHandler(String inputId, Object... ingredients) {
return this;
}
@Override
public ICraftingHandler getRecipeHandler(String outputId, Object... results) {
return this;
}
}