package common.tags;

import java.io.IOException;

enum TagType {
	NULL { // 0
		protected Tag createTag() {
			return null;
		}
	},
	OBJECT { // 1
		protected Tag createTag() {
			return new TagObject();
		}
	},
	BOOLEAN { // 2
		protected Tag createTag() {
			return new TagBool();
		}
	},
	BYTE { // 3
		protected Tag createTag() {
			return new TagByte();
		}
	},
	SHORT { // 4
		protected Tag createTag() {
			return new TagShort();
		}
	},
	CHAR { // 5
		protected Tag createTag() {
			return new TagChar();
		}
	},
	INT { // 6
		protected Tag createTag() {
			return new TagInt();
		}
	},
	LONG { // 7
		protected Tag createTag() {
			return new TagLong();
		}
	},
	FLOAT { // 8
		protected Tag createTag() {
			return new TagFloat();
		}
	},
	DOUBLE { // 9
		protected Tag createTag() {
			return new TagDouble();
		}
	},
	STRING { // 10
		protected Tag createTag() {
			return new TagString();
		}
	},
	LIST { // 11
		protected Tag createTag() {
			return new TagList();
		}
	},
	BYTE_ARRAY { // 12
		protected Tag createTag() {
			return new TagByteArray();
		}
	},
	INT_ARRAY { // 13
		protected Tag createTag() {
			return new TagIntArray();
		}
	},
	STRING_ARRAY { // 14
		protected Tag createTag() {
			return new TagStringArray();
		}
	};
	
	private static final TagType[] TYPES;
	
	private final byte id;
	
	static {
		TYPES = values();
	}

	static Tag create(byte id) throws IOException {
		if(id <= 0 || id >= TYPES.length)
			throw new IOException("Kann keinen gültigen Tag mit ID #" + id + " lesen");
		return TYPES[id].createTag();
	}
	
	private TagType() {
		this.id = (byte)this.ordinal();
	}
	
	protected abstract Tag createTag();
	
	public byte getId() {
		return this.id;
	}
}
