package pneumaticCraft.common.network;

import io.netty.buffer.ByteBuf;

import java.util.ArrayList;
import java.util.Collection;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import pneumaticCraft.common.recipes.AmadronOffer;
import pneumaticCraft.common.recipes.AmadronOfferCustom;
import pneumaticCraft.common.recipes.AmadronOfferManager;
import cpw.mods.fml.common.network.ByteBufUtils;

public class PacketSyncAmadronOffers extends AbstractPacket<PacketSyncAmadronOffers>{
    private Collection<AmadronOffer> offers = new ArrayList<AmadronOffer>();

    public PacketSyncAmadronOffers(){}

    public PacketSyncAmadronOffers(Collection<AmadronOffer> offers){
        this.offers = offers;
    }

    @Override
    public void fromBytes(ByteBuf buf){
        int offerCount = buf.readInt();
        for(int i = 0; i < offerCount; i++) {
            if(buf.readBoolean()) {
                offers.add(AmadronOfferCustom.loadFromBuf(buf));
            } else {
                offers.add(new AmadronOffer(getFluidOrItemStack(buf), getFluidOrItemStack(buf)));
            }
        }
    }

    public static Object getFluidOrItemStack(ByteBuf buf){
        if(buf.readByte() == 0) {
            return ByteBufUtils.readItemStack(buf);
        } else {
            return new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), ByteBufUtils.readTag(buf));
        }
    }

    @Override
    public void toBytes(ByteBuf buf){
        buf.writeInt(offers.size());
        for(AmadronOffer offer : offers) {
            buf.writeBoolean(offer instanceof AmadronOfferCustom);
            writeFluidOrItemStack(offer.getInput(), buf);
            writeFluidOrItemStack(offer.getOutput(), buf);
            if(offer instanceof AmadronOfferCustom) {
                ((AmadronOfferCustom)offer).writeToBuf(buf);
            }
        }
    }

    public static void writeFluidOrItemStack(Object object, ByteBuf buf){
        if(object instanceof ItemStack) {
            buf.writeByte(0);
            ByteBufUtils.writeItemStack(buf, (ItemStack)object);
        } else {
            buf.writeByte(1);
            FluidStack stack = (FluidStack)object;
            ByteBufUtils.writeUTF8String(buf, stack.getFluid().getName());
            buf.writeInt(stack.amount);
            ByteBufUtils.writeTag(buf, stack.tag);
        }
    }

    @Override
    public void handleClientSide(PacketSyncAmadronOffers message, EntityPlayer player){
        AmadronOfferManager.getInstance().setOffers(message.offers);
    }

    @Override
    public void handleServerSide(PacketSyncAmadronOffers message, EntityPlayer player){

    }

}