/*****************************************************************************
 * 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.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.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 ICSSStyleDeclItem && 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;
	}
}