package forestry.api.genetics;

/**
 * Biological classifications from domain down to genus.
 * 
 * Used by the *alyzers to display hierarchies.
 */
public interface IClassification {

	public enum EnumClassLevel {

		DOMAIN(0x777fff, true), KINGDOM(0x77c3ff), PHYLUM(0x77ffb6, true), DIVISION(0x77ffb6, true), CLASS(0x7bff77), ORDER(0xbeff77), FAMILY(0xfffd77),
		SUBFAMILY(0xfffd77), TRIBE(0xfffd77), GENUS(0xffba77);

		private int colour;
		private boolean isDroppable;

		private EnumClassLevel(int colour) {
			this(colour, false);
		}

		private EnumClassLevel(int colour, boolean isDroppable) {
			this.colour = colour;
			this.isDroppable = isDroppable;
		}

		/**
		 * @return Colour to use for displaying this classification.
		 */
		public int getColour() {
			return colour;
		}

		/**
		 * @return Indicates whether display of this classification level can be ommitted in case of space constraints.
		 */
		public boolean isDroppable() {
			return isDroppable;
		}
	}

	/**
	 * @return Level inside the full hierarchy this particular classification is located at.
	 */
	EnumClassLevel getLevel();

	/**
	 * @return Unique String identifier.
	 */
	String getUID();

	/**
	 * @return Localized branch name for user display.
	 */
	String getName();

	/**
	 * A branch approximates a "genus" in real life. Real life examples: "Micrapis", "Megapis"
	 * 
	 * @return flavour text (may be null)
	 */
	String getScientific();

	/**
	 * @return Localized description of this branch. (May be null.)
	 */
	String getDescription();

	/**
	 * @return Member groups of this one.
	 */
	IClassification[] getMemberGroups();

	/**
	 * Adds subgroups to this group.
	 */
	void addMemberGroup(IClassification group);

	/**
	 * @return Member species of this group.
	 */
	IAlleleSpecies[] getMemberSpecies();

	/**
	 * Used by the allele registry to populate internal collection of branch members on the fly.
	 * 
	 * @param species
	 */
	void addMemberSpecies(IAlleleSpecies species);

	/**
	 * @return Parent classification, null if this is root.
	 */
	IClassification getParent();

	/**
	 * Only used internally by the AlleleRegistry if this classification has been added to another one.
	 * 
	 * @param parent
	 */
	void setParent(IClassification parent);
}