/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-API/src/main/java/org/bukkit/entity/Horse.java
package org.bukkit.entity;

import org.bukkit.inventory.HorseInventory;
import org.bukkit.inventory.InventoryHolder;

/**
 * Represents a Horse.
 */
public interface Horse extends Animals, Vehicle, InventoryHolder, Tameable {

	/**
	 * Represents the different types of horses that may exist.
	 */
	public enum Variant {
		/**
		 * A normal horse
		 */
		HORSE,
		/**
		 * A donkey
		 */
		DONKEY,
		/**
		 * A mule
		 */
		MULE,
		/**
		 * An undead horse
		 */
		UNDEAD_HORSE,
		/**
		 * A skeleton horse
		 */
		SKELETON_HORSE,;
	}

	/**
	 * Represents the base color that the horse has.
	 */
	public enum Color {
		/**
		 * Snow white
		 */
		WHITE,
		/**
		 * Very light brown
		 */
		CREAMY,
		/**
		 * Chestnut
		 */
		CHESTNUT,
		/**
		 * Light brown
		 */
		BROWN,
		/**
		 * Pitch black
		 */
		BLACK,
		/**
		 * Gray
		 */
		GRAY,
		/**
		 * Dark brown
		 */
		DARK_BROWN,;
	}

	/**
	 * Represents the style, or markings, that the horse has.
	 */
	public enum Style {
		/**
		 * No markings
		 */
		NONE,
		/**
		 * White socks or stripes
		 */
		WHITE,
		/**
		 * Milky splotches
		 */
		WHITEFIELD,
		/**
		 * Round white dots
		 */
		WHITE_DOTS,
		/**
		 * Small black dots
		 */
		BLACK_DOTS,;
	}

	/**
	 * Gets the horse's variant.
	 * <p>
	 * A horse's variant defines its physical appearance and capabilities. Whether a
	 * horse is a regular horse, donkey, mule, or other kind of horse is determined
	 * using the variant.
	 *
	 * @return a {@link Variant} representing the horse's variant
	 */
	public Variant getVariant();

	/**
	 * Sets the horse's variant.
	 * <p>
	 * A horse's variant defines its physical appearance and capabilities. Whether a
	 * horse is a regular horse, donkey, mule, or other kind of horse can be set
	 * using the variant.
	 * <p>
	 * Setting a horse's variant does not change its attributes such as its owner
	 * and its tamed status, but changing a mule or donkey with a chest to another
	 * variant which does not support a chest will remove the chest and its
	 * contents.
	 *
	 * @param variant a {@link Variant} for this horse
	 */
	public void setVariant(Variant variant);

	/**
	 * Gets the horse's color.
	 * <p>
	 * Colors only apply to horses, not to donkeys, mules, skeleton horses or undead
	 * horses.
	 *
	 * @return a {@link Color} representing the horse's group
	 */
	public Color getColor();

	/**
	 * Sets the horse's color.
	 * <p>
	 * Attempting to set a color for any donkey, mule, skeleton horse or undead
	 * horse will not result in a change.
	 *
	 * @param color a {@link Color} for this horse
	 */
	public void setColor(Color color);

	/**
	 * Gets the horse's style. Styles determine what kind of markings or patterns a
	 * horse has.
	 * <p>
	 * Styles only apply to horses, not to donkeys, mules, skeleton horses or undead
	 * horses.
	 *
	 * @return a {@link Style} representing the horse's style
	 */
	public Style getStyle();

	/**
	 * Sets the style of this horse. Styles determine what kind of markings or
	 * patterns a horse has.
	 * <p>
	 * Attempting to set a style for any donkey, mule, skeleton horse or undead
	 * horse will not result in a change.
	 *
	 * @param style a {@link Style} for this horse
	 */
	public void setStyle(Style style);

	/**
	 * Gets whether the horse has a chest equipped.
	 *
	 * @return true if the horse has chest storage
	 */
	public boolean isCarryingChest();

	/**
	 * Sets whether the horse has a chest equipped. Removing a chest will also clear
	 * the chest's inventory.
	 *
	 * @param chest true if the horse should have a chest
	 */
	public void setCarryingChest(boolean chest);

	/**
	 * Gets the domestication level of this horse.
	 * <p>
	 * A higher domestication level indicates that the horse is closer to becoming
	 * tame. As the domestication level gets closer to the max domestication level,
	 * the chance of the horse becoming tame increases.
	 *
	 * @return domestication level
	 */
	public int getDomestication();

	/**
	 * Sets the domestication level of this horse.
	 * <p>
	 * Setting the domestication level to a high value will increase the horse's
	 * chances of becoming tame.
	 * <p>
	 * Domestication level must be greater than zero and no greater than the max
	 * domestication level of the horse, determined with
	 * {@link #getMaxDomestication()}
	 *
	 * @param level domestication level
	 */
	public void setDomestication(int level);

	/**
	 * Gets the maximum domestication level of this horse.
	 * <p>
	 * The higher this level is, the longer it will likely take for the horse to be
	 * tamed.
	 *
	 * @return the max domestication level
	 */
	public int getMaxDomestication();

	/**
	 * Sets the maximum domestication level of this horse.
	 * <p>
	 * Setting a higher max domestication will increase the amount of domesticating
	 * (feeding, riding, etc.) necessary in order to tame it, while setting a lower
	 * max value will have the opposite effect.
	 * <p>
	 * Maximum domestication must be greater than zero.
	 *
	 * @param level the max domestication level
	 */
	public void setMaxDomestication(int level);

	/**
	 * Gets the jump strength of this horse.
	 * <p>
	 * Jump strength defines how high the horse can jump. A higher jump strength
	 * increases how high a jump will go.
	 *
	 * @return the horse's jump strength
	 */
	public double getJumpStrength();

	/**
	 * Sets the jump strength of this horse.
	 * <p>
	 * A higher jump strength increases how high a jump will go. Setting a jump
	 * strength to 0 will result in no jump. You cannot set a jump strength to a
	 * value below 0 or above 2.
	 *
	 * @param strength jump strength for this horse
	 */
	public void setJumpStrength(double strength);

	@Override
	public HorseInventory getInventory();
}
