package forestry.api.genetics;

import java.util.Collection;

/**
 * Individuals can be seeded either as hive drops or as mutation results.
 * 
 * {@link IAlleleRegistry} manages these.
 * 
 * @author SirSengir
 */
public interface IMutation {

	/**
	 * @return {@link ISpeciesRoot} this mutation is associated with.
	 */
	ISpeciesRoot getRoot();
	
	/**
	 * @return first of the alleles implementing IAlleleSpecies required for this mutation.
	 */
	IAllele getAllele0();

	/**
	 * @return second of the alleles implementing IAlleleSpecies required for this mutation.
	 */
	IAllele getAllele1();

	/**
	 * @return Array of {@link IAllele} representing the full default genome of the mutated side.
	 * 
	 *         Make sure to return a proper array for the species class. Returning an allele of the wrong type will cause cast errors on runtime.
	 */
	IAllele[] getTemplate();

	/**
	 * @return Unmodified base chance for mutation to fire.
	 */
	float getBaseChance();

	/**
	 * @return Collection of localized, human-readable strings describing special mutation conditions, if any. 
	 */
	Collection<String> getSpecialConditions();
	
	/**
	 * @param allele
	 * @return true if the passed allele is one of the alleles participating in this mutation.
	 */
	boolean isPartner(IAllele allele);

	/**
	 * @param allele
	 * @return the other allele which was not passed as argument.
	 */
	IAllele getPartner(IAllele allele);

	/**
	 * @return true if the mutation should not be displayed in the beealyzer.
	 */
	boolean isSecret();

}