package net.torocraft.minecoprocessors.network;

import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IThreadListener;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.torocraft.minecoprocessors.Minecoprocessors;
import net.torocraft.minecoprocessors.gui.GuiMinecoprocessor;

public class MessageProcessorUpdate implements IMessage {

  public BlockPos pos;
  public String name;
  public NBTTagCompound processorData;

  public static void init(int packetId) {
    Minecoprocessors.NETWORK.registerMessage(MessageProcessorUpdate.Handler.class, MessageProcessorUpdate.class, packetId, Side.CLIENT);
  }

  public MessageProcessorUpdate() {

  }

  public MessageProcessorUpdate(NBTTagCompound processorData, BlockPos pos, String name) {
    this.processorData = processorData;
    this.pos = pos;
    this.name = name;
  }

  @Override
  public void fromBytes(ByteBuf buf) {
    processorData = ByteBufUtils.readTag(buf);
    pos = BlockPos.fromLong(buf.readLong());
    name = ByteBufUtils.readUTF8String(buf);
  }

  @Override
  public void toBytes(ByteBuf buf) {
    ByteBufUtils.writeTag(buf, processorData);
    buf.writeLong(pos.toLong());
    ByteBufUtils.writeUTF8String(buf, name);
  }

  public static class Handler implements IMessageHandler<MessageProcessorUpdate, IMessage> {

    @Override
    public IMessage onMessage(final MessageProcessorUpdate message, MessageContext ctx) {

      if (message.processorData == null || message.processorData == null) {
        return null;
      }

      IThreadListener mainThread = Minecraft.getMinecraft();

      mainThread.addScheduledTask(new Runnable() {
        @Override
        public void run() {
          if (GuiMinecoprocessor.INSTANCE == null) {
            return;
          }

          if (!GuiMinecoprocessor.INSTANCE.getPos().equals(message.pos)) {
            Minecoprocessors.NETWORK.sendToServer(new MessageEnableGuiUpdates(message.pos, false));
            return;
          }

          GuiMinecoprocessor.INSTANCE.updateData(message.processorData, message.name);
        }
      });

      return null;
    }
  }

}