/**
 *  Copyright (c) 2011 Mia-Software.
 *
 *  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:
 *  	Gregoire Dupe (Mia-Software) - Bug 361794 - [Restructuring] EMF Facet customization meta-model
 *      Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
 *      Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
 *      Gregoire Dupe (Mia-Software) - Bug 375087 - [Table] ITableWidget.addColumn(List<ETypedElement>, List<FacetSet>)
 *      Nicolas Bros (Mia-Software) - Bug 379683 - customizable Tree content provider
 */
package org.eclipse.emf.facet.custom.ui.internal.query;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.ReflectiveItemProvider;
import org.eclipse.emf.facet.efacet.core.IFacetManager;
import org.eclipse.emf.facet.efacet.core.exception.DerivedTypedElementException;
import org.eclipse.emf.facet.query.java.core.IJavaQuery2;
import org.eclipse.emf.facet.query.java.core.IParameterValueList2;
import org.eclipse.emf.facet.util.emf.core.ModelUtils;

public class LabelQuery implements IJavaQuery2<EObject, String> {

	private static final String NAME = "name"; //$NON-NLS-1$

	public String evaluate(final EObject source,
			final IParameterValueList2 parameterValues,
			final IFacetManager facetManager)
			throws DerivedTypedElementException {
		ETypedElement sfParam = null;
		if (parameterValues != null) {
			sfParam = (ETypedElement) parameterValues
					.getParameterValueByName("eStructuralFeature").getValue(); //$NON-NLS-1$
		}
		String result = null;
		if (sfParam == null) {
			final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
					ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
			final IItemLabelProvider itemLabelProvider = (IItemLabelProvider) adapterFactory
					.adapt(source, IItemLabelProvider.class);
			// We don't want to use a ReflectiveItemProvider because it provides
			// a string prefixed with the eObject's meta-class name.
			if (itemLabelProvider instanceof ReflectiveItemProvider) {
				result = LabelQuery.getDefaultName(source);
			} else if (itemLabelProvider == null) {
				result = ModelUtils.getDefaultName(source);
			} else {
				result = itemLabelProvider.getText(source);
			}
		} else {
			try {
				if (sfParam instanceof EAttribute && sfParam.getUpperBound() == 1) {
					final Object object = facetManager.getOrInvoke(source, sfParam, Object.class);
					final String objectLabel = getObjectLabel(object, facetManager);
					result = sfParam.getName() + " = " + objectLabel; //$NON-NLS-1$
				} else {
					result = sfParam.getName();
				}
			} catch (final Exception e) {
				throw new DerivedTypedElementException(e);
			}
		}
		return result;
	}

	private String getObjectLabel(final Object object,
			final IFacetManager facetManager)
			throws DerivedTypedElementException {
		String result;
		if (object instanceof EObject) {
			final EObject eObject = (EObject) object;
			result = evaluate(eObject, null, facetManager);
		} else {
			result = String.valueOf(object);
		}
		return result;
	}

	/**
	 * @return a default name based on a string feature of the given
	 *         {@link EObject}
	 */
	// from org.eclipse.emf.facet.infra.common.core.internal.utils.ModelUtils
	public static String getDefaultName(final EObject eObject) {
		String result = ""; //$NON-NLS-1$
		// find a feature that can be used as a name
		final EStructuralFeature feature = LabelQuery.getLabelFeature(eObject
				.eClass());
		if (feature != null) {
			result = (String) eObject.eGet(feature);
		}
		return result;
	}

	/**
	 * This method searches for a structural feature that can be used as a name
	 *
	 * @param eClass
	 *            in which class to search a structural feature that can be used as
	 *            a name
	 * @return an EStructuralFeature
	 */
	// Copied from org.eclipse.emf.edit.provider.ReflectiveItemProvider to org.eclipse.emf.facet.infra.common.core.internal.utils.ModelUtils
	// Copied from org.eclipse.emf.facet.infra.common.core.internal.utils.ModelUtils
	private static EStructuralFeature getLabelFeature(final EClass eClass) {
		EAttribute result = null;
		for (final EAttribute eAttribute : eClass.getEAllAttributes()) {
			if (!eAttribute.isMany()
					&& eAttribute.getEType().getInstanceClass() != FeatureMap.Entry.class) {
				if (LabelQuery.NAME.equalsIgnoreCase(eAttribute
						.getName())) {
					result = eAttribute;
					break;
				} else if (result == null) {
					result = eAttribute;
				} else if (eAttribute.getEAttributeType().getInstanceClass() == String.class
						&& result.getEAttributeType().getInstanceClass() != String.class) {
					result = eAttribute;
				}
			}
		}
		return result;
	}

}
