/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.css.ui.internal.image;



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

import org.eclipse.wst.css.core.internal.metamodel.CSSMMProperty;
import org.eclipse.wst.css.core.internal.metamodel.CSSMetaModel;
import org.eclipse.wst.css.core.internal.metamodel.util.CSSMetaModelFinder;
import org.eclipse.wst.css.core.internal.metamodel.util.CSSMetaModelUtil;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSDocument;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorItem;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorList;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSSimpleSelector;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleRule;
import org.w3c.dom.css.CSSCharsetRule;
import org.w3c.dom.css.CSSFontFaceRule;
import org.w3c.dom.css.CSSImportRule;
import org.w3c.dom.css.CSSMediaRule;
import org.w3c.dom.css.CSSPageRule;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleRule;
import org.w3c.dom.css.CSSValue;

/**
 */
public class CSSImageType {

	private final String fName;

	private CSSImageType(String name) {
		this.fName = name;
	}

	public String toString() {
		return fName;
	}

	public static final CSSImageType STYLESHEET = new CSSImageType("STYLESHEET"); //$NON-NLS-1$

	public static final CSSImageType RULE_CHARSET = new CSSImageType("RULE_CHARSET"); //$NON-NLS-1$
	public static final CSSImageType RULE_FONTFACE = new CSSImageType("RULE_FONTFACE"); //$NON-NLS-1$
	public static final CSSImageType RULE_IMPORT = new CSSImageType("RULE_IMPORT"); //$NON-NLS-1$
	public static final CSSImageType RULE_MEDIA = new CSSImageType("RULE_MEDIA"); //$NON-NLS-1$
	public static final CSSImageType RULE_PAGE = new CSSImageType("RULE_PAGE"); //$NON-NLS-1$
	public static final CSSImageType RULE_STYLE = new CSSImageType("RULE_STYLE"); //$NON-NLS-1$
	public static final CSSImageType RULE_UNKNOWN = new CSSImageType("RULE_UNKNOWN"); //$NON-NLS-1$

	public static final CSSImageType SELECTOR_CLASS = new CSSImageType("SELECTOR_CLASS"); //$NON-NLS-1$
	public static final CSSImageType SELECTOR_ID = new CSSImageType("SELECTOR_ID"); //$NON-NLS-1$
	public static final CSSImageType SELECTOR_DEFAULT = new CSSImageType("SELECTOR_DEFAULT"); //$NON-NLS-1$
	public static final CSSImageType SELECTOR_PSEUDO = new CSSImageType("SELECTOR_PSEUDO"); //$NON-NLS-1$
	public static final CSSImageType SELECTOR_TAG = new CSSImageType("SELECTOR_TAG"); //$NON-NLS-1$
	public static final CSSImageType SELECTOR_LINK = new CSSImageType("SELECTOR_LINK"); //$NON-NLS-1$

	public static final CSSImageType VALUE_FUNCTION = new CSSImageType("VALUE_FUNCTION"); //$NON-NLS-1$
	public static final CSSImageType VALUE_NUMBER = new CSSImageType("VALUE_NUMBER"); //$NON-NLS-1$
	public static final CSSImageType VALUE_STRING = new CSSImageType("VALUE_STRING"); //$NON-NLS-1$

	public static final CSSImageType CATEGORY_AURAL = new CSSImageType("CATEGORY_AURAL"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_BOX = new CSSImageType("CATEGORY_BOX"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_COLORANDBACKGROUND = new CSSImageType("CATEGORY_COLORANDBACKGROUND"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_CONTENT = new CSSImageType("CATEGORY_CONTENT"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_FONT = new CSSImageType("CATEGORY_FONT"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_PAGE = new CSSImageType("CATEGORY_PAGE"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_TABLES = new CSSImageType("CATEGORY_TABLES"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_TEXT = new CSSImageType("CATEGORY_TEXT"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_UI = new CSSImageType("CATEGORY_UI"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_VISUAL = new CSSImageType("CATEGORY_VISUAL"); //$NON-NLS-1$
	public static final CSSImageType CATEGORY_DEFAULT = new CSSImageType("CATEGORY_DEFAULT"); //$NON-NLS-1$

	/**
	 * by node
	 */
	public static CSSImageType getImageType(ICSSNode node) {
		CSSImageType imageType = null;
		if (node instanceof CSSCharsetRule) {
			imageType = RULE_CHARSET;
		} else if (node instanceof CSSFontFaceRule) {
			imageType = RULE_FONTFACE;
		} else if (node instanceof CSSImportRule) {
			imageType = RULE_IMPORT;
		} else if (node instanceof CSSMediaRule) {
			imageType = RULE_MEDIA;
		} else if (node instanceof CSSPageRule) {
			imageType = RULE_PAGE;
		} else if (node instanceof CSSStyleRule) {
			imageType = getImageType(((ICSSStyleRule) node).getSelectors());
		} else if (node instanceof CSSStyleDeclaration) {
			ICSSNode parent = node.getParentNode();
			if (parent != null) {
				return getImageType(parent);
			}
		} else if (node instanceof ICSSStyleDeclItem) {
			String name = ((ICSSStyleDeclItem) node).getPropertyName();
			ICSSDocument doc = node.getOwnerDocument();
			ICSSModel model = (doc != null) ? doc.getModel() : null;
			CSSMetaModelFinder finder = CSSMetaModelFinder.getInstance();
			CSSMetaModel metaModel = finder.findMetaModelFor(model);
			// is font-face rule ?
			ICSSNode parent = node.getParentNode();
			if (parent != null) {
				parent = parent.getParentNode();
				if (parent instanceof CSSFontFaceRule) {
					imageType = CSSImageType.CATEGORY_FONT;
				}
			}
			if (imageType == null) {
				CSSMMProperty prop = new CSSMetaModelUtil(metaModel).getProperty(name);
				if (prop != null) {
					String category = prop.getAttribute("category"); //$NON-NLS-1$
					imageType = getImageType(category);
				}
				if (imageType == null) {
					imageType = CSSImageType.CATEGORY_DEFAULT;
				}
			}
		} else if (node instanceof CSSValue) {
			switch (((CSSValue) node).getCssValueType()) {
				case CSSPrimitiveValue.CSS_NUMBER :
				case CSSPrimitiveValue.CSS_PERCENTAGE :
				case CSSPrimitiveValue.CSS_EMS :
				case CSSPrimitiveValue.CSS_EXS :
				case CSSPrimitiveValue.CSS_PX :
				case CSSPrimitiveValue.CSS_CM :
				case CSSPrimitiveValue.CSS_MM :
				case CSSPrimitiveValue.CSS_IN :
				case CSSPrimitiveValue.CSS_PT :
				case CSSPrimitiveValue.CSS_PC :
				case CSSPrimitiveValue.CSS_DEG :
				case CSSPrimitiveValue.CSS_RAD :
				case CSSPrimitiveValue.CSS_GRAD :
				case CSSPrimitiveValue.CSS_MS :
				case CSSPrimitiveValue.CSS_S :
				case CSSPrimitiveValue.CSS_HZ :
				case CSSPrimitiveValue.CSS_KHZ :
				case CSSPrimitiveValue.CSS_DIMENSION :
				case ICSSPrimitiveValue.CSS_INTEGER :
				case ICSSPrimitiveValue.CSS_HASH :
					imageType = VALUE_NUMBER;
					break;
				case CSSPrimitiveValue.CSS_ATTR :
				case CSSPrimitiveValue.CSS_COUNTER :
				case CSSPrimitiveValue.CSS_RECT :
				case CSSPrimitiveValue.CSS_RGBCOLOR :
				case CSSPrimitiveValue.CSS_URI :
				case ICSSPrimitiveValue.CSS_FORMAT :
				case ICSSPrimitiveValue.CSS_LOCAL :
					imageType = VALUE_FUNCTION;
					break;
				default :
					imageType = VALUE_STRING;
					break;
			}
		}
		return imageType;
	}

	public static CSSImageType getImageType(ICSSSelectorList selectorList) {
		if (selectorList == null || selectorList.getLength() == 0) {
			return SELECTOR_DEFAULT;
		}
		CSSImageType imageType = null;
		int nSelectors = selectorList.getLength();
		for (int i = 0; i < nSelectors; i++) {
			CSSImageType candidate = getImageType(selectorList.getSelector(i));
			if (imageType == null) {
				imageType = candidate;
			} else if (imageType != candidate) {
				imageType = null;
				break;
			}
		}

		return (imageType == null) ? SELECTOR_DEFAULT : imageType;
	}

	public static CSSImageType getImageType(ICSSSelector selector) {
		CSSImageType imageType = SELECTOR_DEFAULT;
		if (selector == null || selector.getLength() == 0) {
			return imageType;
		}
		ICSSSelectorItem item = selector.getItem(selector.getLength() - 1);
		if (item.getItemType() == ICSSSelectorItem.SIMPLE) {
			ICSSSimpleSelector ss = (ICSSSimpleSelector) item;
			if (0 < ss.getNumOfIDs()) {
				imageType = SELECTOR_ID;
			} else if (0 < ss.getNumOfClasses()) {
				imageType = SELECTOR_CLASS;
			} else if (0 < ss.getNumOfPseudoNames()) {
				imageType = SELECTOR_PSEUDO;
			} else {
				imageType = SELECTOR_TAG;
			}
		}
		return imageType;
	}

	public static CSSImageType getImageType(String category) {
		if (fCategoryMap == null) {
			fCategoryMap = new HashMap();
			fCategoryMap.put("aural", CATEGORY_AURAL); //$NON-NLS-1$
			fCategoryMap.put("box", CATEGORY_BOX); //$NON-NLS-1$
			fCategoryMap.put("colorandbackground", CATEGORY_COLORANDBACKGROUND); //$NON-NLS-1$
			fCategoryMap.put("content", CATEGORY_CONTENT); //$NON-NLS-1$
			fCategoryMap.put("font", CATEGORY_FONT); //$NON-NLS-1$
			fCategoryMap.put("page", CATEGORY_PAGE); //$NON-NLS-1$
			fCategoryMap.put("tables", CATEGORY_TABLES); //$NON-NLS-1$
			fCategoryMap.put("text", CATEGORY_TEXT); //$NON-NLS-1$
			fCategoryMap.put("ui", CATEGORY_UI); //$NON-NLS-1$
			fCategoryMap.put("visual", CATEGORY_VISUAL); //$NON-NLS-1$
		}
		CSSImageType imageType = (CSSImageType) fCategoryMap.get(category);
		return (imageType == null) ? CATEGORY_DEFAULT : imageType;
	}

	private static Map fCategoryMap = null;
}