package zmaster587.advancedRocketry.inventory.modules;
import java.util.LinkedList;
import java.util.List;
import zmaster587.advancedRocketry.api.DataStorage;
import zmaster587.advancedRocketry.util.IDataInventory;
import zmaster587.libVulpes.inventory.TextureResources;
import zmaster587.libVulpes.inventory.modules.IButtonInventory;
import zmaster587.libVulpes.inventory.modules.ModuleBase;
import zmaster587.libVulpes.inventory.modules.ModuleButton;
import zmaster587.libVulpes.util.IconResource;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
public class ModuleData extends ModuleBase implements IButtonInventory {
static final int barYSize = 38;
static final int barXSize = 6;
static final int textureOffsetX = 0;
static final int textureOffsetY = 215;
DataStorage data[];
int prevData[];
int prevDataType;
int slot;
IDataInventory chipStorage;
IconResource icon = zmaster587.advancedRocketry.inventory.TextureResources.ioSlot;
ModuleButton buttonStore, buttonLoad;
public ModuleData(int offsetX, int offsetY, int slot, IDataInventory chipStorage, DataStorage ... data) {
super(offsetX, offsetY);
this.data = data;
prevData = new int[data.length];
this.chipStorage = chipStorage;
this.slot = slot;
buttonStore = new ModuleButton(10 + offsetX, offsetY, 0, "", this, TextureResources.buttonDown, "Store to Chip", 16, 10);
buttonLoad = new ModuleButton(12 + offsetX, 36 + offsetY, 1, "", this, TextureResources.buttonLeft, "Store to buffer", 10, 16);
}
@Override
public List<GuiButton> addButtons(int x, int y) {
List<GuiButton> list = buttonLoad.addButtons(x, y);
list.addAll(buttonStore.addButtons(x, y));
return list;
}
@Override
public void onInventoryButtonPressed(int buttonId) {
if(buttonId == 0) {
chipStorage.storeData();
}
else if(buttonId == 1) {
chipStorage.loadData();
}
}
@Override
public void actionPerform(GuiButton button) {
buttonStore.actionPerform(button);
buttonLoad.actionPerform(button);
}
@Override
public List<Slot> getSlots(Container container) {
slotList.add(new SlotData(chipStorage, slot, offsetX + 10, offsetY + 16));
return slotList;
}
@Override
public int numberOfChangesToSend() {
return data.length + 1;
}
@Override
public boolean needsUpdate(int localId) {
if(localId < data.length)
return data[localId].getData() != prevData[localId];
return data[0].getDataType().ordinal() != prevDataType;
}
@Override
protected void updatePreviousState(int localId) {
if(localId < data.length)
prevData[localId] = data[localId].getData();
else
prevDataType = data[0].getDataType().ordinal();
}
@Override
public void sendChanges(Container container, ICrafting crafter,
int variableId, int localId) {
if(localId < data.length)
crafter.sendProgressBarUpdate(container, variableId, data[localId].getData());
else
crafter.sendProgressBarUpdate(container, variableId, data[0].getDataType().ordinal());
}
@Override
public void onChangeRecieved(int slot, int value) {
if(slot < data.length)
data[slot].setData(value, DataStorage.DataType.UNDEFINED);
else
data[0].setDataType(DataStorage.DataType.values()[value]);
}
@SideOnly(Side.CLIENT)
@Override
public void renderForeground(int guiOffsetX, int guiOffsetY, int mouseX, int mouseY, float zLevel, GuiContainer gui, FontRenderer font) {
buttonLoad.renderForeground(guiOffsetX, guiOffsetY, mouseX, mouseY, zLevel, gui, font);
buttonStore.renderForeground(guiOffsetX, guiOffsetY, mouseX, mouseY, zLevel, gui, font);
int relativeX = mouseX - offsetX;
int relativeY = mouseY - offsetY;
//Handles data tooltip
if( relativeX > 0 && relativeX < barXSize && relativeY > 0 && relativeY < barYSize) {
int totalData = 0, totalMaxData = 0;
for(DataStorage datum : data) {
totalData += datum.getData();
totalMaxData += datum.getMaxData();
}
List<String> list = new LinkedList<String>();
list.add(totalData + " / " + totalMaxData + " Data");
list.add("Type: " + I18n.format(data[0].getDataType().toString(), new Object[0]));
this.drawTooltip(gui, list, mouseX, mouseY, zLevel, font);
}
}
@Override
@SideOnly(Side.CLIENT)
public void renderBackground(GuiContainer gui, int x, int y, int mouseX, int mouseY, FontRenderer font) {
buttonLoad.renderBackground(gui, x, y, mouseX, mouseY, font);
buttonStore.renderBackground(gui, x, y, mouseX, mouseY, font);
for(Slot slot : slotList) {
gui.drawTexturedModalRect(x + slot.xDisplayPosition - 1, y + slot.yDisplayPosition - 1, icon.getxLoc(), icon.getyLoc(), icon.getxSize(), icon.getySize());
}
int totalData = 0, totalMaxData = 0;
for(DataStorage datum : data) {
totalData += datum.getData();
totalMaxData += datum.getMaxData();
}
float percent = totalData/(float)totalMaxData;
gui.drawTexturedModalRect(offsetX + x, offsetY + y, 176, 18, 8, 40);
gui.drawTexturedModalRect(offsetX + x - 1, offsetY + y + barYSize + 4, 19, 171, 10, 10);
gui.drawTexturedModalRect(offsetX + x + 1, 1 + offsetY + y + (barYSize-(int)(percent*barYSize)), textureOffsetX, barYSize- (int)(percent*barYSize) + textureOffsetY, barXSize, (int)(percent*barYSize));
}
}