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

import java.util.Map;

import com.google.common.collect.ImmutableMap;

/**
 * All supported color values for dyes and cloth
 */
public enum DyeColor {

	/**
	 * Represents white dye.
	 */
	WHITE(0x0, 0xF, Color.WHITE, Color.fromRGB(0xF0F0F0)),
	/**
	 * Represents orange dye.
	 */
	ORANGE(0x1, 0xE, Color.fromRGB(0xD87F33), Color.fromRGB(0xEB8844)),
	/**
	 * Represents magenta dye.
	 */
	MAGENTA(0x2, 0xD, Color.fromRGB(0xB24CD8), Color.fromRGB(0xC354CD)),
	/**
	 * Represents light blue dye.
	 */
	LIGHT_BLUE(0x3, 0xC, Color.fromRGB(0x6699D8), Color.fromRGB(0x6689D3)),
	/**
	 * Represents yellow dye.
	 */
	YELLOW(0x4, 0xB, Color.fromRGB(0xE5E533), Color.fromRGB(0xDECF2A)),
	/**
	 * Represents lime dye.
	 */
	LIME(0x5, 0xA, Color.fromRGB(0x7FCC19), Color.fromRGB(0x41CD34)),
	/**
	 * Represents pink dye.
	 */
	PINK(0x6, 0x9, Color.fromRGB(0xF27FA5), Color.fromRGB(0xD88198)),
	/**
	 * Represents gray dye.
	 */
	GRAY(0x7, 0x8, Color.fromRGB(0x4C4C4C), Color.fromRGB(0x434343)),
	/**
	 * Represents silver dye.
	 */
	SILVER(0x8, 0x7, Color.fromRGB(0x999999), Color.fromRGB(0xABABAB)),
	/**
	 * Represents cyan dye.
	 */
	CYAN(0x9, 0x6, Color.fromRGB(0x4C7F99), Color.fromRGB(0x287697)),
	/**
	 * Represents purple dye.
	 */
	PURPLE(0xA, 0x5, Color.fromRGB(0x7F3FB2), Color.fromRGB(0x7B2FBE)),
	/**
	 * Represents blue dye.
	 */
	BLUE(0xB, 0x4, Color.fromRGB(0x334CB2), Color.fromRGB(0x253192)),
	/**
	 * Represents brown dye.
	 */
	BROWN(0xC, 0x3, Color.fromRGB(0x664C33), Color.fromRGB(0x51301A)),
	/**
	 * Represents green dye.
	 */
	GREEN(0xD, 0x2, Color.fromRGB(0x667F33), Color.fromRGB(0x3B511A)),
	/**
	 * Represents red dye.
	 */
	RED(0xE, 0x1, Color.fromRGB(0x993333), Color.fromRGB(0xB3312C)),
	/**
	 * Represents black dye.
	 */
	BLACK(0xF, 0x0, Color.fromRGB(0x191919), Color.fromRGB(0x1E1B1B));

	private final byte woolData;
	private final byte dyeData;
	private final Color color;
	private final Color firework;
	private final static DyeColor[] BY_WOOL_DATA;
	private final static DyeColor[] BY_DYE_DATA;
	private final static Map<Color, DyeColor> BY_COLOR;
	private final static Map<Color, DyeColor> BY_FIREWORK;

	private DyeColor(final int woolData, final int dyeData, Color color, Color firework) {
		this.woolData = (byte) woolData;
		this.dyeData = (byte) dyeData;
		this.color = color;
		this.firework = firework;
	}

	/**
	 * Gets the associated (wool) data value representing this color.
	 *
	 * @return A byte containing the (wool) data value of this color
	 * @deprecated The name is misleading. It would imply {@link Material#INK_SACK}
	 *             but uses {@link Material#WOOL}
	 * @see #getWoolData()
	 * @see #getDyeData()
	 */
	@Deprecated
	public byte getData() {
		return getWoolData();
	}

	/**
	 * Gets the associated wool data value representing this color.
	 *
	 * @return A byte containing the wool data value of this color
	 * @see #getDyeData()
	 * @deprecated Magic value
	 */
	@Deprecated
	public byte getWoolData() {
		return woolData;
	}

	/**
	 * Gets the associated dye data value representing this color.
	 *
	 * @return A byte containing the dye data value of this color
	 * @see #getWoolData()
	 * @deprecated Magic value
	 */
	@Deprecated
	public byte getDyeData() {
		return dyeData;
	}

	/**
	 * Gets the color that this dye represents.
	 *
	 * @return The {@link Color} that this dye represents
	 */
	public Color getColor() {
		return color;
	}

	/**
	 * Gets the firework color that this dye represents.
	 *
	 * @return The {@link Color} that this dye represents
	 */
	public Color getFireworkColor() {
		return firework;
	}

	/**
	 * Gets the DyeColor with the given (wool) data value.
	 *
	 * @param data (wool) data value to fetch
	 * @return The {@link DyeColor} representing the given value, or null if it
	 *         doesn't exist
	 * @deprecated The name is misleading. It would imply {@link Material#INK_SACK}
	 *             but uses {@link Material#WOOL}
	 * @see #getByDyeData(byte)
	 * @see #getByWoolData(byte)
	 */
	@Deprecated
	public static DyeColor getByData(final byte data) {
		return getByWoolData(data);
	}

	/**
	 * Gets the DyeColor with the given wool data value.
	 *
	 * @param data Wool data value to fetch
	 * @return The {@link DyeColor} representing the given value, or null if it
	 *         doesn't exist
	 * @see #getByDyeData(byte)
	 * @deprecated Magic value
	 */
	@Deprecated
	public static DyeColor getByWoolData(final byte data) {
		int i = 0xff & data;
		if (i >= BY_WOOL_DATA.length) {
			return null;
		}
		return BY_WOOL_DATA[i];
	}

	/**
	 * Gets the DyeColor with the given dye data value.
	 *
	 * @param data Dye data value to fetch
	 * @return The {@link DyeColor} representing the given value, or null if it
	 *         doesn't exist
	 * @see #getByWoolData(byte)
	 * @deprecated Magic value
	 */
	@Deprecated
	public static DyeColor getByDyeData(final byte data) {
		int i = 0xff & data;
		if (i >= BY_DYE_DATA.length) {
			return null;
		}
		return BY_DYE_DATA[i];
	}

	/**
	 * Gets the DyeColor with the given color value.
	 *
	 * @param color Color value to get the dye by
	 * @return The {@link DyeColor} representing the given value, or null if it
	 *         doesn't exist
	 */
	public static DyeColor getByColor(final Color color) {
		return BY_COLOR.get(color);
	}

	/**
	 * Gets the DyeColor with the given firework color value.
	 *
	 * @param color Color value to get dye by
	 * @return The {@link DyeColor} representing the given value, or null if it
	 *         doesn't exist
	 */
	public static DyeColor getByFireworkColor(final Color color) {
		return BY_FIREWORK.get(color);
	}

	static {
		BY_WOOL_DATA = values();
		BY_DYE_DATA = values();
		ImmutableMap.Builder<Color, DyeColor> byColor = ImmutableMap.builder();
		ImmutableMap.Builder<Color, DyeColor> byFirework = ImmutableMap.builder();

		for (DyeColor color : values()) {
			BY_WOOL_DATA[color.woolData & 0xff] = color;
			BY_DYE_DATA[color.dyeData & 0xff] = color;
			byColor.put(color.getColor(), color);
			byFirework.put(color.getFireworkColor(), color);
		}

		BY_COLOR = byColor.build();
		BY_FIREWORK = byFirework.build();
	}
}
