package advancedsystemsmanager.flow.elements;
import advancedsystemsmanager.api.ISystemType;
import advancedsystemsmanager.api.gui.IContainerSelection;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.client.gui.GuiManager;
import advancedsystemsmanager.client.gui.TextColour;
import advancedsystemsmanager.flow.menus.MenuListOrder;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import advancedsystemsmanager.util.ColourUtils;
import advancedsystemsmanager.util.SystemCoord;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gnu.trove.map.hash.TIntObjectHashMap;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.StatCollector;
import javax.annotation.Nonnull;
import java.util.*;
public class Variable implements Comparable<Variable>, IContainerSelection
{
public static final TIntObjectHashMap<String> defaultVariables = new TIntObjectHashMap<String>();
public static final long NEGATIVE = (long)1 << 63;
public static final int VARIABLE_SRC_X = 104;
public static final int VARIABLE_SRC_Y = 127;
public static final int VARIABLE_SIZE = 14;
public static final String NBT_EXECUTED = "Executed";
public static final String NBT_SELECTION = "Selection";
public static final String NBT_SELECTION_ID = "Id";
public static final String NBT_COLOUR = "Colour";
private static final String NBT_NAME = "Name";
public int colour;
public TextColour textColour;
public FlowComponent declaration;
public List<Long> containers = new ArrayList<Long>();
public boolean executed;
private float[] hsv = new float[3];
private int[] rgba = new int[4];
private String defaultName;
private int containerIndex;
static
{
defaultVariables.put(0xFFFFFF, Names.VARIABLE_WHITE);
defaultVariables.put(0xd97f33, Names.VARIABLE_ORANGE);
defaultVariables.put(0xb24cd9, Names.VARIABLE_MAGENTA);
defaultVariables.put(0x6699d9, Names.VARIABLE_LIGHT_BLUE);
defaultVariables.put(0xe5e533, Names.VARIABLE_YELLOW);
defaultVariables.put(0x7fcc33, Names.VARIABLE_LIME);
defaultVariables.put(0xf37fa6, Names.VARIABLE_PINK);
defaultVariables.put(0x4c4c4c, Names.VARIABLE_GRAY);
defaultVariables.put(0x999999, Names.VARIABLE_LIGHT_GRAY);
defaultVariables.put(0x4c7f99, Names.VARIABLE_CYAN);
defaultVariables.put(0x7f40b2, Names.VARIABLE_PURPLE);
defaultVariables.put(0x334cb2, Names.VARIABLE_BLUE);
defaultVariables.put(0x664c33, Names.VARIABLE_BROWN);
defaultVariables.put(0x667f33, Names.VARIABLE_GREEN);
defaultVariables.put(0x993333, Names.VARIABLE_RED);
defaultVariables.put(0x141414, Names.VARIABLE_BLACK);
}
public Variable(int colour)
{
setColour(colour);
this.defaultName = getDefaultName();
}
private void setColour(int colour)
{
this.colour = colour;
this.rgba[0] = (colour >> 16) & 0xFF;
this.rgba[1] = (colour >> 8) & 0xFF;
this.rgba[2] = colour & 0xFF;
this.rgba[3] = 0xFF;
textColour = TextColour.getClosestColour(colour);
ColourUtils.HextoHSV(colour, hsv);
}
public String getDefaultName()
{
String result = Integer.toHexString(colour);
while (result.length() < 6) result = "0" + result;
return "#" + result;
}
public Variable(int colour, String name)
{
setColour(colour);
this.defaultName = name;
}
public Variable(NBTTagCompound tagCompound)
{
setColour(tagCompound.getInteger(NBT_COLOUR));
readFromNBT(tagCompound);
if (defaultName != null && defaultVariables.containsKey(colour))
{
defaultName = defaultVariables.get(colour);
} else
{
defaultName = getDefaultName();
}
}
public void readFromNBT(NBTTagCompound nbtTagCompound)
{
executed = nbtTagCompound.getBoolean(NBT_EXECUTED);
defaultName = nbtTagCompound.getString(NBT_NAME);
containers.clear();
NBTTagList tagList = nbtTagCompound.getTagList(NBT_SELECTION, 10);
for (int i = 0; i < tagList.tagCount(); i++)
{
NBTTagCompound selectionTag = tagList.getCompoundTagAt(i);
containers.add(selectionTag.getLong(NBT_SELECTION_ID));
}
}
public static TIntObjectHashMap<Variable> getDefaultVariables()
{
TIntObjectHashMap<Variable> defaults = new TIntObjectHashMap<Variable>(20, 0.8F, -1);
for (int colour : defaultVariables.keys())
{
if (colour != defaultVariables.getNoEntryKey())
defaults.put(colour, new Variable(colour, defaultVariables.get(colour)));
}
return defaults;
}
public boolean isValid()
{
return declaration != null;
}
@Override
public long getId()
{
return NEGATIVE | colour;
}
@Override
@SideOnly(Side.CLIENT)
public void draw(GuiManager gui, int x, int y)
{
gui.drawColouredTexture(x + 1, y + 1, VARIABLE_SRC_X, VARIABLE_SRC_Y, VARIABLE_SIZE, VARIABLE_SIZE, rgba);
}
@Override
@SideOnly(Side.CLIENT)
public String getDescription(GuiManager gui)
{
return textColour.toString() + getNameFromColor();
}
@Override
@SideOnly(Side.CLIENT)
public String getName(GuiManager gui)
{
return getNameFromColor();
}
@Override
public boolean isVariable()
{
return true;
}
public String getNameFromColor()
{
if (getDeclaration() == null || getDeclaration().getComponentName() == null)
{
return StatCollector.translateToLocal(defaultName);
} else
{
return getDeclaration().getComponentName();
}
}
public FlowComponent getDeclaration()
{
return declaration;
}
public void setDeclaration(FlowComponent flowComponent)
{
if (flowComponent == null || declaration == null)
{
declaration = flowComponent;
}
}
public List<Long> getContainers()
{
return containerIndex == -1 ? containers : Collections.singletonList(containers.get(containerIndex));
}
public void applyOrder(MenuListOrder order)
{
order.applyOrder(containers);
}
public void setContainers(List<Long> containers)
{
this.containers = containers;
}
public void add(long id)
{
if (!containers.contains(id))
{
containers.add(id);
}
}
public long getContainer()
{
return containerIndex == -1 || containerIndex >= getNumContainers() ? -1 : containers.get(containerIndex);
}
public void setContainerIndex(int idx)
{
this.containerIndex = idx;
}
public int getNumContainers()
{
return containers.size();
}
public boolean hasBeenExecuted()
{
return executed;
}
public void setExecuted(boolean executed)
{
this.executed = executed;
}
public void clearContainers()
{
containers.clear();
}
public void remove(long id)
{
containers.remove(id);
}
public void writeToNBT(NBTTagCompound nbtTagCompound)
{
nbtTagCompound.setBoolean(NBT_EXECUTED, executed);
nbtTagCompound.setInteger(NBT_COLOUR, colour);
nbtTagCompound.setString(NBT_NAME, defaultName);
NBTTagList tagList = new NBTTagList();
for (Long container : containers)
{
NBTTagCompound selectionTag = new NBTTagCompound();
selectionTag.setLong(NBT_SELECTION_ID, container);
tagList.appendTag(selectionTag);
}
nbtTagCompound.setTag(NBT_SELECTION, tagList);
}
@Override
public int compareTo(@Nonnull Variable o)
{
if (hsv[0] < o.hsv[0])
return -1;
if (hsv[0] > o.hsv[0])
return 1;
if (hsv[1] < o.hsv[1])
return -1;
if (hsv[1] > o.hsv[1])
return 1;
if (hsv[2] > o.hsv[2])
return -1;
if (hsv[2] < o.hsv[2])
return 1;
return 0;
}
public Collection<SystemCoord> getContainers(TileEntityManager manager, Set<ISystemType> types)
{
List<SystemCoord> result = new ArrayList<SystemCoord>();
for (long selected : containers)
{
if (selected >= 0)
{
SystemCoord coord = manager.getInventory(selected);
if (coord != null && coord.isValid() && coord.isOfAnyType(types))
{
result.add(coord);
}
} else
{
Variable variable = manager.getVariable((int) selected);
if (variable != null)
{
result.addAll(variable.getContainers(manager, types));
}
}
}
return result;
}
}