package us.myles.ViaVersion.api.type.types.minecraft;

import io.netty.buffer.ByteBuf;
import us.myles.ViaVersion.api.minecraft.metadata.MetaType;
import us.myles.ViaVersion.api.minecraft.metadata.Metadata;

public abstract class ModernMetaType extends MetaTypeTemplate {
    @Override
    public Metadata read(final ByteBuf buffer) throws Exception {
        final short index = buffer.readUnsignedByte();
        if (index == 0xff) return null; // End of metadata
        final MetaType type = this.getType(buffer.readByte());
        return new Metadata(index, type, type.getType().read(buffer));
    }

    protected abstract MetaType getType(final int index);

    @Override
    public void write(final ByteBuf buffer, final Metadata object) throws Exception {
        if (object == null) {
            buffer.writeByte(0xff);
        } else {
            buffer.writeByte(object.getId());
            final MetaType type = object.getMetaType();
            buffer.writeByte(type.getTypeID());
            type.getType().write(buffer, object.getValue());
        }
    }
}