package net.minecraft.src.weasel;

import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.PC_Utils;

/**
 * Type of a Weasel data object
 * 
 * @author MightyPork
 * @copy (c) 2012
 *
 */
public enum WeaselObjectType {
	
	BOOLEAN(1), INTEGER(2), STRING(3), VARIABLE_LIST(4), STACK(5);

	/**  */
	private final int index;

	private WeaselObjectType(int index) {
		this.index = index;
	}
	
	public static WeaselObjectType getTypeFromIndex(int index){
		switch (index) {	
			case 1: return BOOLEAN;	
			case 2: return INTEGER;	
			case 3: return STRING;	
			case 4: return VARIABLE_LIST;	
			case 5: return STACK;
			default: return null;
		}
	}
	
	/**
	 * @return type index
	 */
	public int getIndex(){
		return index;
	}

	/**
	 * Load object written into NBT tag
	 * @param tag the tag with object
	 * @return the object
	 */
	public static WeaselObject loadObjectFromNBT(NBTTagCompound tag) {
		WeaselObject obj = null;
	
		switch (getTypeFromIndex(tag.getInteger("type"))) {
	
			case BOOLEAN:
				obj = new WeaselBoolean();
				obj.readFromNBT(tag);
				break;
	
			case INTEGER:
				obj = new WeaselInteger();
				obj.readFromNBT(tag);
				break;
				
			case STRING:
				obj = new WeaselString();
				obj.readFromNBT(tag);
				break;
	
			case VARIABLE_LIST:
				obj = new WeaselVariableList();
				obj.readFromNBT(tag);
				break;
	
			case STACK:
				obj = new WeaselStack();
				obj.readFromNBT(tag);
				break;
	
		}
	
		return obj;
	}
	
	public static WeaselObject loadWrappedObjectFromNBT(NBTTagCompound outerTag, String wrappingTagName){
		return loadObjectFromNBT(outerTag.getCompoundTag(wrappingTagName));
	}
	
	public static void saveWrappedObjectToNBT(NBTTagCompound outerTag, String wrappingTagName, WeaselObject savedObject){
		PC_Utils.writeWrappedToNBT(outerTag, wrappingTagName, savedObject);
	}
	
	
}
