/*
 * Code and resources for our Code Book were taken from TIS-3D
 * (https://github.com/MightyPirates/TIS-3D), released under the MIT license
 * by Florian "Sangar" Nücke.
 */

package net.torocraft.minecoprocessors.network;

import io.netty.buffer.ByteBuf;
import java.io.IOException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.EnumHand;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.torocraft.minecoprocessors.Minecoprocessors;
import net.torocraft.minecoprocessors.items.ItemBookCode;

public final class MessageBookCodeData implements IMessage {

  private NBTTagCompound nbt;

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

  public MessageBookCodeData(final NBTTagCompound nbt) {
    this.nbt = nbt;
  }

  public MessageBookCodeData() {
  }

  // --------------------------------------------------------------------- //

  public NBTTagCompound getNbt() {
    return nbt;
  }

  // --------------------------------------------------------------------- //
  // IMessage

  @Override
  public void fromBytes(final ByteBuf buf) {
    final PacketBuffer buffer = new PacketBuffer(buf);
    try {
      nbt = buffer.readCompoundTag();
    } catch (final IOException e) {
      Minecoprocessors.proxy.logger.warn("Invalid packet received.", e);
    }
  }

  @Override
  public void toBytes(final ByteBuf buf) {
    final PacketBuffer buffer = new PacketBuffer(buf);
    buffer.writeCompoundTag(nbt);
  }

  public static final class Handler extends AbstractMessageHandler<MessageBookCodeData> {

    @Override
    protected void onMessageSynchronized(final MessageBookCodeData message, final MessageContext context) {
      final EntityPlayer player = context.getServerHandler().player;
      if (player != null) {
        final ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND);
        if (ItemBookCode.isBookCode(stack)) {
          final ItemBookCode.Data data = ItemBookCode.Data.loadFromNBT(message.getNbt());
          ItemBookCode.Data.saveToStack(stack, data);
        }
      }
    }
  }
}