package crazypants.enderio.conduit.gui;
import java.awt.Color;
import java.awt.Rectangle;
import java.util.Collections;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.opengl.GL11;
import com.enderio.core.client.gui.button.ColorButton;
import com.enderio.core.client.gui.button.IconButton;
import com.enderio.core.client.gui.button.MultiIconButton;
import com.enderio.core.client.gui.widget.GuiToolTip;
import com.enderio.core.client.render.ColorUtil;
import com.enderio.core.client.render.RenderUtil;
import com.enderio.core.common.util.DyeColor;
import crazypants.enderio.EnderIO;
import crazypants.enderio.conduit.ConnectionMode;
import crazypants.enderio.conduit.IConduit;
import crazypants.enderio.conduit.liquid.EnderLiquidConduit;
import crazypants.enderio.conduit.liquid.FluidFilter;
import crazypants.enderio.conduit.liquid.ILiquidConduit;
import crazypants.enderio.conduit.packet.PacketExtractMode;
import crazypants.enderio.gui.IconEIO;
import crazypants.enderio.gui.RedstoneModeButton;
import crazypants.enderio.machine.IRedstoneModeControlable;
import crazypants.enderio.machine.RedstoneControlMode;
import crazypants.enderio.network.PacketHandler;
public class LiquidSettings extends BaseSettingsPanel {
static final int ID_REDSTONE_BUTTON = GuiExternalConnection.nextButtonId();
private static final int ID_COLOR_BUTTON = GuiExternalConnection.nextButtonId();
private static final int ID_WHITELIST = GuiExternalConnection.nextButtonId();
private static final int NEXT_FILTER_ID = 989322;
private final RedstoneModeButton rsB;
private final ColorButton colorB;
private static final String autoExtractStr = EnderIO.lang.localize("gui.conduit.fluid.autoExtract");
private static final String filterStr = EnderIO.lang.localize("gui.conduit.fluid.filter");
private final ILiquidConduit conduit;
private EnderLiquidConduit eConduit;
private boolean isEnder;
private static final int filterX = 59;
private static final int filterY = 63;
private static final Rectangle filterBounds = new Rectangle(filterX, filterY, 90, 18);
private GuiToolTip[] filterToolTips;
private boolean inOutShowIn = true;
private MultiIconButton inOutNextB;
private IconButton whiteListB;
protected LiquidSettings(final GuiExternalConnection gui, IConduit con) {
super(IconEIO.WRENCH_OVERLAY_FLUID, EnderIO.lang.localize("itemLiquidConduit.name"), gui, con);
conduit = (ILiquidConduit) con;
if(con instanceof EnderLiquidConduit) {
eConduit = (EnderLiquidConduit) con;
isEnder = true;
int x = gui.getXSize() - 20;
int y = customTop;
inOutNextB = MultiIconButton.createRightArrowButton(gui, NEXT_FILTER_ID, x, y);
x = filterX - 20;
y = filterY + 1;
whiteListB = new IconButton(gui, ID_WHITELIST, x, y, IconEIO.FILTER_WHITELIST);
whiteListB.setToolTip(EnderIO.lang.localize("gui.conduit.fluid.whitelist"));
} else {
isEnder = false;
gui.getContainer().setInventorySlotsVisible(false);
}
int x = gap + gui.getFontRenderer().getStringWidth(autoExtractStr) + gap * 2;
int y = customTop;
rsB = new RedstoneModeButton(gui, ID_REDSTONE_BUTTON, x, y, new IRedstoneModeControlable() {
@Override
public void setRedstoneControlMode(RedstoneControlMode mode) {
RedstoneControlMode curMode = getRedstoneControlMode();
conduit.setExtractionRedstoneMode(mode, gui.getDir());
if(curMode != mode) {
PacketHandler.INSTANCE.sendToServer(new PacketExtractMode(conduit, gui.getDir()));
}
}
@Override
public RedstoneControlMode getRedstoneControlMode() {
return conduit.getExtractionRedstoneMode(gui.getDir());
}
});
x += rsB.getWidth() + gap;
colorB = new ColorButton(gui, ID_COLOR_BUTTON, x, y);
colorB.setToolTipHeading(EnderIO.lang.localize("gui.conduit.redstone.signalColor"));
colorB.setColorIndex(conduit.getExtractionSignalColor(gui.getDir()).ordinal());
}
private void addFilterTooltips() {
filterToolTips = new GuiToolTip[5];
for (int i = 0; i < 5; i++) {
Rectangle bound = new Rectangle(filterX + (i * 18), filterY, 18, 18);
filterToolTips[i] = new FilterToolTip(bound, i);
gui.addToolTip(filterToolTips[i]);
}
}
@Override
public void actionPerformed(GuiButton guiButton) {
super.actionPerformed(guiButton);
if(guiButton.id == ID_COLOR_BUTTON) {
conduit.setExtractionSignalColor(gui.getDir(), DyeColor.values()[colorB.getColorIndex()]);
PacketHandler.INSTANCE.sendToServer(new PacketExtractMode(conduit, gui.getDir()));
} else if(guiButton.id == ID_WHITELIST) {
toggleBlacklist();
} else if(guiButton.id == NEXT_FILTER_ID) {
inOutShowIn = !inOutShowIn;
if(isInput()) {
rsB.onGuiInit();
colorB.onGuiInit();
} else {
rsB.detach();
colorB.detach();
}
if(isFilterVisible()) {
updateWhiteListButton(eConduit.getFilter(gui.getDir(), isInput()));
}
}
}
@Override
protected void connectionModeChanged(ConnectionMode conectionMode) {
super.connectionModeChanged(conectionMode);
updateGuiVisibility();
}
private void toggleBlacklist() {
if(!isFilterVisible()) {
return;
}
FluidFilter filter = eConduit.getFilter(gui.getDir(), isInput());
if(filter == null) {
filter = new FluidFilter();
}
filter.setBlacklist(!filter.isBlacklist());
setConduitFilter(filter);
updateWhiteListButton(filter);
}
@Override
public void mouseClicked(int x, int y, int par3) {
if(!isFilterVisible()) {
return;
}
if(!filterBounds.contains(x, y)) {
return;
}
ItemStack st = Minecraft.getMinecraft().thePlayer.inventory.getItemStack();
FluidFilter filter = eConduit.getFilter(gui.getDir(), isInput());
if(filter == null && st == null) {
return;
}
if(filter == null) {
filter = new FluidFilter();
}
int slot = (x - filterX) / 18;
filter.setFluid(slot, st);
setConduitFilter(filter);
}
protected void setConduitFilter(FluidFilter filter) {
eConduit.setFilter(gui.getDir(), filter, isInput());
PacketHandler.INSTANCE.sendToServer(new PacketFluidFilter(eConduit, gui.getDir(), filter, isInput()));
}
@Override
protected void initCustomOptions() {
updateGuiVisibility();
}
private void updateGuiVisibility() {
deactivate();
if(isInput()) {
rsB.onGuiInit();
colorB.onGuiInit();
}
if(!isEnder) {
return;
}
if(isFilterVisible()) {
gui.getContainer().setInventorySlotsVisible(true);
addFilterTooltips();
whiteListB.onGuiInit();
updateWhiteListButton(eConduit.getFilter(gui.getDir(), isInput()));
} else {
gui.getContainer().setInventorySlotsVisible(false);
}
ConnectionMode mode = con.getConnectionMode(gui.getDir());
if(mode == ConnectionMode.IN_OUT) {
inOutNextB.onGuiInit();
}
}
private void updateWhiteListButton(FluidFilter filter) {
if(filter != null && filter.isBlacklist()) {
whiteListB.setIcon(IconEIO.FILTER_BLACKLIST);
whiteListB.setToolTip(EnderIO.lang.localize("gui.conduit.fluid.blacklist"));
} else {
whiteListB.setIcon(IconEIO.FILTER_WHITELIST);
whiteListB.setToolTip(EnderIO.lang.localize("gui.conduit.fluid.whitelist"));
}
}
@Override
public void deactivate() {
rsB.detach();
colorB.detach();
if(isEnder) {
gui.getContainer().setInventorySlotsVisible(false);
if(filterToolTips != null) {
for (GuiToolTip tt : filterToolTips) {
if(tt != null) {
gui.removeToolTip(tt);
}
}
}
inOutNextB.detach();
whiteListB.detach();
}
}
@Override
protected void renderCustomOptions(int top, float par1, int par2, int par3) {
boolean isInput = isInput();
if(isInput) {
int x = gui.getGuiLeft() + gap + gui.getFontRenderer().getStringWidth(autoExtractStr) + gap + 2;
int y = top;
gui.getFontRenderer().drawString(autoExtractStr, left, y, ColorUtil.getRGB(Color.DARK_GRAY));
}
if(isEnder && isFilterVisible()) {
if(conduit.getConnectionMode(gui.getDir()) == ConnectionMode.IN_OUT) {
String inOutStr = inOutShowIn ? EnderIO.lang.localize("gui.conduit.ioMode.input") : EnderIO.lang.localize("gui.conduit.ioMode.output");
int x = gui.getGuiLeft() + gui.getXSize() - 20 - 5 - gui.getFontRenderer().getStringWidth(inOutStr);
int y = top;
gui.getFontRenderer().drawString(inOutStr, x, y, ColorUtil.getRGB(Color.DARK_GRAY));
}
GL11.glColor3f(1, 1, 1);
gui.bindGuiTexture(1);
gui.drawTexturedModalRect(gui.getGuiLeft(), gui.getGuiTop() + 55, 0, 55, gui.getXSize(), 145);
FontRenderer fr = gui.getFontRenderer();
int sw = fr.getStringWidth(filterStr);
int x = (gui.width / 2) - sw / 2;
int y = top + 20;
fr.drawString(filterStr, x, y, ColorUtil.getRGB(Color.DARK_GRAY));
x = gui.getGuiLeft() + filterX;
y = gui.getGuiTop() + filterY;
GL11.glColor3f(1, 1, 1);
gui.bindGuiTexture();
gui.drawTexturedModalRect(x, y, 24, 238, 90, 18);
FluidFilter filter = eConduit.getFilter(gui.getDir(), isInput);
if(filter != null && !filter.isEmpty()) {
for (int i = 0; i < filter.size(); i++) {
FluidStack f = filter.getFluidStackAt(i);
if(f != null) {
renderFluid(f, x + (i * 18), y);
}
}
}
}
}
private void renderFluid(FluidStack f, int x, int y) {
IIcon icon = f.getFluid().getIcon();
if(icon != null) {
RenderUtil.bindBlockTexture();
int color = f.getFluid().getColor(f);
GL11.glColor3ub((byte) (color >> 16 & 0xFF), (byte) (color >> 8 & 0xFF), (byte) (color & 0xFF));
gui.drawTexturedModelRectFromIcon(x + 1, y + 1, icon, 16, 16);
GL11.glColor3f(1, 1, 1);
}
}
private boolean isInput() {
ConnectionMode mode = conduit.getConnectionMode(gui.getDir());
return (mode == ConnectionMode.IN_OUT && inOutShowIn) || (mode == ConnectionMode.INPUT);
}
private boolean isFilterVisible() {
if(!isEnder) {
return false;
}
ConnectionMode mode = conduit.getConnectionMode(gui.getDir());
return mode == ConnectionMode.INPUT || mode == ConnectionMode.OUTPUT || mode == ConnectionMode.IN_OUT;
}
private class FilterToolTip extends GuiToolTip {
int index;
public FilterToolTip(Rectangle bounds, int index) {
super(bounds, (String[]) null);
this.index = index;
}
@Override
public List<String> getToolTipText() {
if(!isFilterVisible()) {
return null;
}
FluidFilter filter = eConduit.getFilter(gui.getDir(), isInput());
if(filter == null) {
return null;
}
if (filter.getFluidStackAt(index) == null) {
return null;
}
return Collections.singletonList(filter.getFluidStackAt(index).getLocalizedName());
}
}
}