package mods.eln.sixnode.wirelesssignal.rx;
import mods.eln.i18n.I18N;
import mods.eln.misc.Coordonate;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDU;
import mods.eln.misc.Utils;
import mods.eln.node.NodeBase;
import mods.eln.node.six.SixNode;
import mods.eln.node.six.SixNodeDescriptor;
import mods.eln.node.six.SixNodeElement;
import mods.eln.sim.ElectricalLoad;
import mods.eln.sim.ThermalLoad;
import mods.eln.sim.nbt.NbtElectricalGateOutput;
import mods.eln.sim.nbt.NbtElectricalGateOutputProcess;
import mods.eln.sixnode.wirelesssignal.aggregator.BiggerAggregator;
import mods.eln.sixnode.wirelesssignal.aggregator.IWirelessSignalAggregator;
import mods.eln.sixnode.wirelesssignal.aggregator.SmallerAggregator;
import mods.eln.sixnode.wirelesssignal.aggregator.ToogleAggregator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import javax.annotation.Nullable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class WirelessSignalRxElement extends SixNodeElement {
NbtElectricalGateOutput outputGate = new NbtElectricalGateOutput("outputGate");
NbtElectricalGateOutputProcess outputGateProcess = new NbtElectricalGateOutputProcess("outputGateProcess", outputGate);
public String channel = "Default channel";
WirelessSignalRxProcess slowProcess = new WirelessSignalRxProcess(this);
WirelessSignalRxDescriptor descriptor;
ToogleAggregator toogleAggregator;
boolean connection = false;
public static final byte setChannelId = 1;
public static final byte setSelectedAggregator = 2;
IWirelessSignalAggregator[] aggregators;
int selectedAggregator = 0;
public WirelessSignalRxElement(SixNode sixNode, Direction side, SixNodeDescriptor descriptor) {
super(sixNode, side, descriptor);
this.descriptor = (WirelessSignalRxDescriptor) descriptor;
electricalLoadList.add(outputGate);
electricalComponentList.add(outputGateProcess);
electricalProcessList.add(slowProcess);
aggregators = new IWirelessSignalAggregator[3];
aggregators[0] = new BiggerAggregator();
aggregators[1] = new SmallerAggregator();
aggregators[2] = toogleAggregator = new ToogleAggregator();
}
@Override
public ElectricalLoad getElectricalLoad(LRDU lrdu) {
if (front == lrdu) return outputGate;
return null;
}
@Override
public ThermalLoad getThermalLoad(LRDU lrdu) {
return null;
}
@Override
public int getConnectionMask(LRDU lrdu) {
if (front == lrdu) return NodeBase.maskElectricalOutputGate;
return 0;
}
@Override
public String multiMeterString() {
return outputGate.plot("Output gate");
}
@Nullable
@Override
public Map<String, String> getWaila() {
Map<String, String> info = new HashMap<String, String>();
info.put(I18N.tr("Channel"), (connection ? "\u00A7a" : "\u00A7c") + channel);
info.put(I18N.tr("Output voltage"), Utils.plotVolt("", outputGate.getU()));
return info;
}
@Override
public String thermoMeterString() {
return null;
}
@Override
public void initialize() {
}
void setConnection(boolean connection) {
if (connection != this.connection) {
this.connection = connection;
needPublish();
}
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setString("channel", channel);
nbt.setBoolean("connection", connection);
nbt.setInteger("selectedAggregator", selectedAggregator);
toogleAggregator.writeToNBT(nbt, "toogleAggregator");
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
channel = nbt.getString("channel");
connection = nbt.getBoolean("connection");
selectedAggregator = nbt.getInteger("selectedAggregator");
toogleAggregator.readFromNBT(nbt, "toogleAggregator");
}
@Override
public Coordonate getCoordonate() {
return sixNode.coordonate;
}
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
try {
switch (stream.readByte()) {
case setChannelId:
channel = stream.readUTF();
slowProcess.sleepTimer = 0;
needPublish();
break;
case setSelectedAggregator:
selectedAggregator = stream.readByte();
needPublish();
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean hasGui() {
return true;
}
@Override
public void networkSerialize(DataOutputStream stream) {
super.networkSerialize(stream);
try {
stream.writeUTF(channel);
stream.writeBoolean(connection);
stream.writeByte(selectedAggregator);
} catch (IOException e) {
e.printStackTrace();
}
}
public IWirelessSignalAggregator getAggregator() {
if (selectedAggregator >= 0 && selectedAggregator < aggregators.length)
return aggregators[selectedAggregator];
return null;
}
// HashMap<String, ArrayList<IWirelessSignalTx>> wirelessTxInRange = new HashMap<String, ArrayList<IWirelessSignalTx>>();
// ArrayList<IWirelessSignalSpot> wirelessSpotInRange = new ArrayList<IWirelessSignalSpot>();
}