package speiger.src.coreengine.utils.io.dataTag.special;

import java.util.UUID;

import speiger.src.coreengine.utils.io.dataTag.DataTag;
import speiger.src.coreengine.utils.io.dataTag.array.ByteArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.DoubleArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.FloatArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.IntArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.LongArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.MediumArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.ShortArrayTag;
import speiger.src.coreengine.utils.io.dataTag.array.StringArrayTag;
import speiger.src.coreengine.utils.io.dataTag.simple.ByteTag;
import speiger.src.coreengine.utils.io.dataTag.simple.DoubleTag;
import speiger.src.coreengine.utils.io.dataTag.simple.FloatTag;
import speiger.src.coreengine.utils.io.dataTag.simple.IntTag;
import speiger.src.coreengine.utils.io.dataTag.simple.LongTag;
import speiger.src.coreengine.utils.io.dataTag.simple.MediumTag;
import speiger.src.coreengine.utils.io.dataTag.simple.PrimitiveTag;
import speiger.src.coreengine.utils.io.dataTag.simple.ShortTag;
import speiger.src.coreengine.utils.io.dataTag.simple.StringTag;

public interface IListTag extends DataTag
{
	public void add(DataTag tag);
	public default void addList(ListTag list) { if(!list.isEmpty()) add(list); }
	public default void addMap(MapTag map) { if(!map.isEmpty()) add(map); }
	public DataTag get(int index);
	
	public default void addByte(byte value) {add(new ByteTag(value));}
	public default void addShort(short value) {add(new ShortTag(value));}
	public default void addMedium(int value) {add(new MediumTag(value));}
	public default void addInt(int value) {add(new IntTag(value));}
	public default void addLong(long value) {add(new LongTag(value));}
	public default void addFloat(float value) {add(new FloatTag(value));}
	public default void addDouble(double value) {add(new DoubleTag(value));}
	public default void addString(String value) {add(new StringTag(value));}
	
	public default void addByteArray(byte[] value) {add(new ByteArrayTag(value));}
	public default void addShortArray(short[] value) {add(new ShortArrayTag(value));}
	public default void addMediumArray(int[] value) {add(new MediumArrayTag(value));}
	public default void addIntArray(int[] value) {add(new IntArrayTag(value));}
	public default void addLongArray(long[] value) {add(new LongArrayTag(value));}
	public default void addFloatArray(float[] value) {add(new FloatArrayTag(value));}
	public default void addDoubleArray(double[] value) {add(new DoubleArrayTag(value));}
	public default void addStringArray(String[] value) {add(new StringArrayTag(value));}
	
	public default void addUUID(UUID id) {add(new LongArrayTag(new long[]{id.getMostSignificantBits(), id.getLeastSignificantBits()}));}
	
	public default byte getByte(int index) {return ((PrimitiveTag)get(index)).asByte();}
	public default short getShort(int index) {return ((PrimitiveTag)get(index)).asShort();}
	public default int getMedium(int index) {return ((PrimitiveTag)get(index)).asInt();}
	public default int getInt(int index) {return ((PrimitiveTag)get(index)).asInt();}
	public default long getLong(int index) {return ((PrimitiveTag)get(index)).asLong();}
	public default float getFloat(int index) {return ((PrimitiveTag)get(index)).asFloat();}
	public default double getDouble(int index) {return ((PrimitiveTag)get(index)).asDouble();}
	public default String getString(int index) {return ((StringTag)get(index)).get();}
	
	public default byte[] getByteArray(int index) {return ((ByteArrayTag)get(index)).get();}
	public default short[] getShortArray(int index) {return ((ShortArrayTag)get(index)).get();}
	public default int[] getMediumArray(int index) {return ((MediumArrayTag)get(index)).get();}
	public default int[] getIntArray(int index) {return ((IntArrayTag)get(index)).get();}
	public default long[] getLongArray(int index) {return ((LongArrayTag)get(index)).get();}
	public default float[] getFloatArray(int index) {return ((FloatArrayTag)get(index)).get();}
	public default double[] getDoubleArray(int index) {return ((DoubleArrayTag)get(index)).get();}
	public default String[] getStringArray(int index) {return ((StringArrayTag)get(index)).get();}
	
	public default UUID getUUID(int index) 
	{
		long[] id = getLongArray(index);
		return new UUID(id[0], id[1]);
	}
	
	public default ListTag getList(int index){return (ListTag)get(index);}
	public default MapTag getMap(int index){return (MapTag)get(index);}
}
