package protocolsupport.protocol.packet.middle.serverbound.play;

import protocolsupport.protocol.ConnectionImpl;
import protocolsupport.protocol.packet.PacketType;
import protocolsupport.protocol.packet.middle.ServerBoundMiddlePacket;
import protocolsupport.protocol.packet.middleimpl.ServerBoundPacketData;
import protocolsupport.protocol.serializer.MiscSerializer;
import protocolsupport.protocol.serializer.StringSerializer;
import protocolsupport.protocol.utils.EnumConstantLookups;

public abstract class MiddleRecipeBookData extends ServerBoundMiddlePacket {

	public MiddleRecipeBookData(ConnectionImpl connection) {
		super(connection);
	}

	protected Type type;
	protected String recipeId;
	protected boolean craftRecipeBookOpen;
	protected boolean craftRecipeBookFiltering;
	protected boolean smeltingRecipeBookOpen;
	protected boolean smeltingRecipeBookFiltering;
	protected boolean blastingRecipeBookOpen;
	protected boolean blastingRecipeBookFiltering;
	protected boolean smokingRecipeBookOpen;
	protected boolean smokingRecipeBookFiltering;

	@Override
	protected void writeToServer() {
		ServerBoundPacketData recipebookdata = ServerBoundPacketData.create(PacketType.SERVERBOUND_PLAY_RECIPE_BOOK_DATA);
		MiscSerializer.writeVarIntEnum(recipebookdata, type);
		switch (type) {
			case DISPLAYED_RECIPE: {
				StringSerializer.writeVarIntUTF8String(recipebookdata, recipeId);
				break;
			}
			case RECIPE_BOOK_STATUS: {
				recipebookdata.writeBoolean(craftRecipeBookOpen);
				recipebookdata.writeBoolean(craftRecipeBookFiltering);
				recipebookdata.writeBoolean(smeltingRecipeBookOpen);
				recipebookdata.writeBoolean(smeltingRecipeBookFiltering);
				recipebookdata.writeBoolean(blastingRecipeBookOpen);
				recipebookdata.writeBoolean(blastingRecipeBookFiltering);
				recipebookdata.writeBoolean(smokingRecipeBookOpen);
				recipebookdata.writeBoolean(smokingRecipeBookFiltering);
				break;
			}
		}
		codec.read(recipebookdata);
	}

	public static enum Type {
		DISPLAYED_RECIPE, RECIPE_BOOK_STATUS;
		public static final EnumConstantLookups.EnumConstantLookup<Type> CONSTANT_LOOKUP = new EnumConstantLookups.EnumConstantLookup<>(Type.class);
	}

}