/*******************************************************************************
 * Copyright (c) 2004, 2008 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.contentassist;



import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.wst.css.core.internal.CSSCorePlugin;
import org.eclipse.wst.css.core.internal.metamodel.CSSMMNode;
import org.eclipse.wst.css.core.internal.metamodel.util.CSSMetaModelUtil;
import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts;
import org.eclipse.wst.css.core.internal.preferences.CSSCorePreferenceNames;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleRule;
import org.eclipse.wst.css.ui.internal.image.CSSImageType;

class CSSProposalGeneratorForDeclarationName extends CSSProposalGenerator {

	/**
	 * CSSProposalGeneratorForDeclaration constructor comment.
	 * 
	 */
	CSSProposalGeneratorForDeclarationName(CSSContentAssistContext context) {
		super(context);
	}

	/**
	 * getCandidates method comment.
	 */
	protected Iterator getCandidates() {
		List candidates = new ArrayList();
		Preferences preferences = CSSCorePlugin.getDefault().getPluginPreferences();
		String preDelim = "";//$NON-NLS-1$
		for (int i = 0; i < preferences.getInt(CSSCorePreferenceNames.FORMAT_PROP_PRE_DELIM); i++) {
			preDelim += ' ';//$NON-NLS-1$
		}
		String postDelim = "";//$NON-NLS-1$
		for (int i = 0; i < preferences.getInt(CSSCorePreferenceNames.FORMAT_PROP_POST_DELIM); i++) {
			postDelim += ' ';//$NON-NLS-1$
		}

		ICSSNode targetNode = fContext.getTargetNode();
		boolean bFontRule = false;
		for (ICSSNode node = targetNode; node != null; node = node.getParentNode()) {
			if (node instanceof org.w3c.dom.css.CSSFontFaceRule) {
				bFontRule = true;
				break;
			}
		}

		List names = new ArrayList();
		CSSMetaModelUtil util = new CSSMetaModelUtil(fContext.getMetaModel());
		Iterator iNames = util.collectNodesByType((bFontRule) ? CSSMMNode.TYPE_DESCRIPTOR : CSSMMNode.TYPE_PROPERTY);
		while (iNames.hasNext()) {
			CSSMMNode node = (CSSMMNode) iNames.next();
			names.add(node);
		}
		sortNames(names);
		// Collections.sort(names);

		boolean bAddColon = true;
		if ((targetNode instanceof ICSSStyleRule || targetNode instanceof ICSSStyleDeclItem || targetNode instanceof ICSSStyleDeclaration) && fContext.targetHas(CSSRegionContexts.CSS_DECLARATION_SEPARATOR)) {
			bAddColon = false;
		}

		Iterator i = names.iterator();
		while (i.hasNext()) {
			CSSMMNode node = (CSSMMNode) i.next();
			String text = node.getName();
			text = (preferences.getInt(CSSCorePreferenceNames.CASE_PROPERTY_NAME) == CSSCorePreferenceNames.UPPER) ? text.toUpperCase() : text.toLowerCase();
			if (!isMatch(text)) {
				continue;
			}

			int cursorPos = 0;
			StringBuffer buf = new StringBuffer();
			buf.append(text);
			buf.append(preDelim);
			cursorPos = buf.length();
			if (bAddColon) {
				buf.append(':');//$NON-NLS-1$
				buf.append(postDelim);
				cursorPos += 1 + postDelim.length();
			}
			// if (! (targetNode instanceof ICSSStyleDeclItem)) {
			// buf.append(';');//$NON-NLS-1$
			// }

			CSSCACandidate item = new CSSCACandidate();
			item.setReplacementString(buf.toString());
			item.setCursorPosition(cursorPos);
			item.setDisplayString(text);
			item.setImageType(getCategoryImageType(node));
			candidates.add(item);
		}

		return candidates.iterator();
	}

	void sortNames(List names) {
		Collections.sort(names, new Comparator() {
			public int compare(Object o1, Object o2) {
				CSSMMNode node1 = (CSSMMNode) o1;
				CSSMMNode node2 = (CSSMMNode) o2;
				if (node1 == null) {
					return 1;
				} else if (node2 == null) {
					return -1;
				}
				int diff = 0;
				String category1 = node1.getAttribute("category"); //$NON-NLS-1$
				String category2 = node2.getAttribute("category"); //$NON-NLS-1$
				if (category1 == null) {
					if (category2 == null) {
						diff = 0;
					} else {
						return 1;
					}
				} else if (category2 == null) {
					return -1;
				} else {
					diff = category1.compareTo(category2);
				}
				if (diff == 0) {
					String name = node1.getName();
					if (name == null) {
						return 1;
					} else {
						return name.compareTo(node2.getName());
					}
				} else {
					return diff;
				}
			}
		});
	}

	/*
	 * retrieve default category icon name TODO: if node has "icon"(?), use
	 * it.
	 */
	CSSImageType getCategoryImageType(CSSMMNode node) {
		CSSImageType imageType = null;
		if (node != null) {
			String category = node.getAttribute("category"); //$NON-NLS-1$
			if (category != null) {
				imageType = CSSImageType.getImageType(category);
			}
		}
		return (imageType == null) ? CSSImageType.CATEGORY_DEFAULT : imageType;
	}
}
