/*******************************************************************************
 * Copyright (c) 2008 Angelo Zerr and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
 *******************************************************************************/
package org.eclipse.e4.ui.css.core.css2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.e4.ui.css.core.dom.properties.converters.ICSSValueConverterColorConfig;
import org.eclipse.e4.ui.css.core.dom.properties.converters.ICSSValueConverterConfig;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.RGBColor;

/**
 * CSS2 Color Helper.
 * 
 * @version 1.0.0
 * @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a>
 * 
 */
public class CSS2ColorHelper {

	/**
	 * Map with key=color name and value=hexadecimal color.
	 */
	private static Map colorNamesMap = new HashMap();;

	/**
	 * Map with key=hexadecimal color and value=color name.
	 */
	private static Map colorHexasMap = new HashMap();;

	/**
	 * Return w3c {@link RGBColor} from string value. Format String value is
	 * hexadecimal like #FFFFFF or color name like white.
	 * 
	 * @param value
	 * @return
	 */
	public static RGBColor getRGBColor(String value) {
		if (value.startsWith("#") && value.length() == 7) {
			// Color is like #FFFFFF
			try {
				int redValue = Integer.decode("0x" + value.substring(1, 3))
						.intValue();
				int greenValue = Integer.decode("0x" + value.substring(3, 5))
						.intValue();
				int blueValue = Integer.decode("0x" + value.substring(5))
						.intValue();
				return new CSS2RGBColorImpl(redValue, greenValue, blueValue);
			} catch (Exception e) {
				return null;
			}
		}
		// Search if it's color name
		value = value.toLowerCase();
		value = (String) colorNamesMap.get(value);
		if (value != null)
			return getRGBColor(value);
		return null;
	}

	/**
	 * Return color string form w3c <code>rgbColor</code> instance. The format
	 * (Hexa, color name or rgb format) of the color string is managed with
	 * <code>config</code> {@link ICSSValueConverterConfig}.
	 * 
	 * @param rgbColor
	 * @param config
	 * @return
	 */
	public static String getColorStringValue(RGBColor rgbColor,
			ICSSValueConverterConfig config) {
		if (config instanceof ICSSValueConverterColorConfig) {
			ICSSValueConverterColorConfig colorConfig = (ICSSValueConverterColorConfig) config;
			switch (colorConfig.getFormat()) {
			case ICSSValueConverterColorConfig.COLOR_HEXA_FORMAT:
				return getHexaColorStringValue(rgbColor);
			case ICSSValueConverterColorConfig.COLOR_RGB_FORMAT:
				return getRGBColorStringValue(rgbColor);
			case ICSSValueConverterColorConfig.COLOR_NAME_FORMAT:
				// Get the Hexa color string value
				String hexaColor = getHexaColorStringValue(rgbColor);
				if (hexaColor != null) {
					// Search into hexa map the color name
					String colorName = getColorNameFromHexaColor(hexaColor);
					if (colorName != null)
						return colorName;
					// Color name is not found, return the Hexa value
					return hexaColor;

				}
				return getRGBColorStringValue(rgbColor);
			}

		}
		return getHexaColorStringValue(rgbColor);
	}

	/**
	 * Return rgb (ex : rgb(0,0,0)) color string value from w3c
	 * <code>rgbColor</code> instance.
	 * 
	 * @param rgbColor
	 * @return
	 */
	public static String getRGBColorStringValue(RGBColor rgbColor) {
		String result = "rgb(";
		int red = (int) rgbColor.getRed().getFloatValue(
				CSSPrimitiveValue.CSS_NUMBER);
		result += red;
		result += ",";
		int green = (int) rgbColor.getGreen().getFloatValue(
				CSSPrimitiveValue.CSS_NUMBER);
		result += green;
		result += ",";
		int blue = (int) rgbColor.getBlue().getFloatValue(
				CSSPrimitiveValue.CSS_NUMBER);
		result += blue;
		result += ")";
		return result;
	}

	/**
	 * Return hexadecimal (ex : #FFFFFF) color string value from w3c
	 * <code>rgbColor</code> instance.
	 * 
	 * @param rgbColor
	 * @return
	 */
	public static String getHexaColorStringValue(RGBColor rgbColor) {
		String result = "#";
		int red = (int) rgbColor.getRed().getFloatValue(
				CSSPrimitiveValue.CSS_NUMBER);
		if (red < 16)
			result += "0";
		result += Integer.toHexString(red);
		int green = (int) rgbColor.getGreen().getFloatValue(
				CSSPrimitiveValue.CSS_NUMBER);
		if (green < 16)
			result += "0";
		result += Integer.toHexString(green);
		int blue = (int) rgbColor.getBlue().getFloatValue(
				CSSPrimitiveValue.CSS_NUMBER);
		if (blue < 16)
			result += "0";
		result += Integer.toHexString(blue);
		return result;
	}

	/**
	 * Return the Hexa color (ex : #FFFFFF) from color name (ex : white).
	 * 
	 * @param colorName
	 * @return
	 */
	public static String getHexaColorFromColorName(String colorName) {
		return (String) colorNamesMap.get(colorName);
	}

	/**
	 * Return true if <code>value</code> is color name (ex : white) and false
	 * otherwise.
	 * 
	 * @param value
	 * @return
	 */
	public static boolean isColorName(String value) {
		return (colorNamesMap.get(value) != null);
	}

	/**
	 * Return the color name (ex : white) from Hexa color (ex : #FFFFFF).
	 * 
	 * @param hexaColor
	 * @return
	 */
	public static String getColorNameFromHexaColor(String hexaColor) {
		hexaColor = hexaColor.toUpperCase();
		return (String) colorHexasMap.get(hexaColor);
	}

	static {
		colorNamesMap.put("aliceBlue", "#F0F8FF");
		colorNamesMap.put("aqua", "#00FFFF");
		colorNamesMap.put("aquamarine", "#7FFFD4");
		colorNamesMap.put("azure", "#F0FFFF");
		colorNamesMap.put("beige", "#F5F5DC");
		colorNamesMap.put("bisque", "#FFE4C4");
		colorNamesMap.put("black", "#000000");
		colorNamesMap.put("blanchedalmond", "#FFEBCD");
		colorNamesMap.put("blue", "#0000FF");
		colorNamesMap.put("blueviolet", "#8A2BE2");
		colorNamesMap.put("brown", "#A52A2A");
		colorNamesMap.put("burlywood", "#DEB887");
		colorNamesMap.put("cadetblue", "#5F9EA0");
		colorNamesMap.put("chartreuse", "#7FFF00");
		colorNamesMap.put("chocolate", "#D2691E");
		colorNamesMap.put("coral", "#FF7F50");
		colorNamesMap.put("cornflowerblue", "#6495ED");
		colorNamesMap.put("cornsilk", "#FFF8DC");
		colorNamesMap.put("crimson", "#DC143C");
		colorNamesMap.put("cyan", "#00FFFF");
		colorNamesMap.put("darkblue", "#00008B");
		colorNamesMap.put("darkcyan", "#008B8B");
		colorNamesMap.put("darkgoldenrod", "#B8860B");
		colorNamesMap.put("darkgray", "#A9A9A9");
		colorNamesMap.put("darkgrey", "#A9A9A9");
		colorNamesMap.put("darkgreen", "#006400");
		colorNamesMap.put("darkkhaki", "#BDB76B");
		colorNamesMap.put("darkmagenta", "#8B008B");
		colorNamesMap.put("darkolivegreen", "#556B2F");
		colorNamesMap.put("darkorange", "#FF8C00");
		colorNamesMap.put("darkorchid", "#9932CC");
		colorNamesMap.put("darkred", "#8B0000");
		colorNamesMap.put("darksalmon", "#E9967A");
		colorNamesMap.put("darkseagreen", "#8FBC8F");
		colorNamesMap.put("darkslateblue", "#483D8B");
		colorNamesMap.put("darkslategray", "#2F4F4F");
		colorNamesMap.put("darkslategrey", "#2F4F4F");
		colorNamesMap.put("darkturquoise", "#00CED1");
		colorNamesMap.put("darkviolet", "#9400D3");
		colorNamesMap.put("deeppink", "#FF1493");
		colorNamesMap.put("deepskyblue", "#00BFFF");
		colorNamesMap.put("dimgray", "#696969");
		colorNamesMap.put("dimgrey", "#696969");
		colorNamesMap.put("dodgerblue", "#1E90FF");
		colorNamesMap.put("firebrick", "#B22222");
		colorNamesMap.put("floralwhite", "#FFFAF0");
		colorNamesMap.put("forestgreen", "#228B22");
		colorNamesMap.put("fuchsia", "#FF00FF");
		colorNamesMap.put("gainsboro", "#DCDCDC");
		colorNamesMap.put("ghostwhite", "#F8F8FF");
		colorNamesMap.put("gold", "#FFD700");
		colorNamesMap.put("goldenrod", "#DAA520");
		colorNamesMap.put("gray", "#808080");
		colorNamesMap.put("grey", "#808080");
		colorNamesMap.put("green", "#008000");
		colorNamesMap.put("greenyellow", "#ADFF2F");
		colorNamesMap.put("honeydew", "#F0FFF0");
		colorNamesMap.put("hotpink", "#FF69B4");
		colorNamesMap.put("indianred", "#CD5C5C");
		colorNamesMap.put("indigo", "#4B0082");
		colorNamesMap.put("ivory", "#FFFFF0");
		colorNamesMap.put("khaki", "#F0E68C");
		colorNamesMap.put("lavender", "#E6E6FA");
		colorNamesMap.put("lavenderblush", "#FFF0F5");
		colorNamesMap.put("lawngreen", "#7CFC00");
		colorNamesMap.put("lemonchiffon", "#FFFACD");
		colorNamesMap.put("lightblue", "#ADD8E6");
		colorNamesMap.put("lightcoral", "#F08080");
		colorNamesMap.put("lightcyan", "#E0FFFF");
		colorNamesMap.put("lightgoldenrodyellow", "#FAFAD2");
		colorNamesMap.put("lightgray", "#D3D3D3");
		colorNamesMap.put("lightgrey", "#D3D3D3");
		colorNamesMap.put("lightgreen", "#90EE90");
		colorNamesMap.put("lightpink", "#FFB6C1");
		colorNamesMap.put("lightsalmon", "#FFA07A");
		colorNamesMap.put("lightseagreen", "#20B2AA");
		colorNamesMap.put("lightskyblue", "#87CEFA");
		colorNamesMap.put("lightslategray", "#778899");
		colorNamesMap.put("lightslategrey", "#778899");
		colorNamesMap.put("lightsteelblue", "#B0C4DE");
		colorNamesMap.put("lightyellow", "#FFFFE0");
		colorNamesMap.put("lime", "#00FF00");
		colorNamesMap.put("limegreen", "#32CD32");
		colorNamesMap.put("linen", "#FAF0E6");
		colorNamesMap.put("magenta", "#FF00FF");
		colorNamesMap.put("maroon", "#800000");
		colorNamesMap.put("mediumaquamarine", "#66CDAA");
		colorNamesMap.put("mediumblue", "#0000CD");
		colorNamesMap.put("mediumorchid", "#BA55D3");
		colorNamesMap.put("mediumpurple", "#9370D8");
		colorNamesMap.put("mediumseagreen", "#3CB371");
		colorNamesMap.put("mediumslateblue", "#7B68EE");
		colorNamesMap.put("mediumspringgreen", "#00FA9A");
		colorNamesMap.put("mediumturquoise", "#48D1CC");
		colorNamesMap.put("mediumvioletred", "#C71585");
		colorNamesMap.put("midnightblue", "#191970");
		colorNamesMap.put("mintcream", "#F5FFFA");
		colorNamesMap.put("mistyrose", "#FFE4E1");
		colorNamesMap.put("moccasin", "#FFE4B5");
		colorNamesMap.put("navajowhite", "#FFDEAD");
		colorNamesMap.put("navy", "#000080");
		colorNamesMap.put("oldlace", "#FDF5E6");
		colorNamesMap.put("olive", "#808000");
		colorNamesMap.put("olivedrab", "#6B8E23");
		colorNamesMap.put("orange", "#FFA500");
		colorNamesMap.put("orangered", "#FF4500");
		colorNamesMap.put("orchid", "#DA70D6");
		colorNamesMap.put("palegoldenrod", "#EEE8AA");
		colorNamesMap.put("palegreen", "#98FB98");
		colorNamesMap.put("paleturquoise", "#AFEEEE");
		colorNamesMap.put("palevioletred", "#D87093");
		colorNamesMap.put("papayawhip", "#FFEFD5");
		colorNamesMap.put("peachpuff", "#FFDAB9");
		colorNamesMap.put("peru", "#CD853F");
		colorNamesMap.put("pink", "#FFC0CB");
		colorNamesMap.put("plum", "#DDA0DD");
		colorNamesMap.put("powderblue", "#B0E0E6");
		colorNamesMap.put("purple", "#800080");
		colorNamesMap.put("red", "#FF0000");
		colorNamesMap.put("rosybrown", "#BC8F8F");
		colorNamesMap.put("royalblue", "#4169E1");
		colorNamesMap.put("saddlebrown", "#8B4513");
		colorNamesMap.put("salmon", "#FA8072");
		colorNamesMap.put("sandybrown", "#F4A460");
		colorNamesMap.put("seagreen", "#2E8B57");
		colorNamesMap.put("seashell", "#FFF5EE");
		colorNamesMap.put("sienna", "#A0522D");
		colorNamesMap.put("silver", "#C0C0C0");
		colorNamesMap.put("skyblue", "#87CEEB");
		colorNamesMap.put("slateblue", "#6A5ACD");
		colorNamesMap.put("slategray", "#708090");
		colorNamesMap.put("slategrey", "#708090");
		colorNamesMap.put("snow", "#FFFAFA");
		colorNamesMap.put("springgreen", "#00FF7F");
		colorNamesMap.put("steelblue", "#4682B4");
		colorNamesMap.put("tan", "#D2B48C");
		colorNamesMap.put("teal", "#008080");
		colorNamesMap.put("thistle", "#D8BFD8");
		colorNamesMap.put("tomato", "#FF6347");
		colorNamesMap.put("turquoise", "#40E0D0");
		colorNamesMap.put("violet", "#EE82EE");
		colorNamesMap.put("wheat", "#F5DEB3");
		colorNamesMap.put("white", "#FFFFFF");
		colorNamesMap.put("whitesmoke", "#F5F5F5");
		colorNamesMap.put("yellow", "#FFFF00");
		colorNamesMap.put("yellowgreen", "#9ACD32");

		// Build Map with key=hexadecimal color and value=color name
		for (Iterator iterator = colorNamesMap.entrySet().iterator(); iterator
				.hasNext();) {
			Map.Entry entry = (Map.Entry) iterator.next();
			colorHexasMap.put(entry.getValue(), entry.getKey());
		}
	}
}
