/*******************************************************************************
 * Copyright (c) 2012, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Nicolas Bros (Mia-Software) - Bug 379683 - customizable Tree content provider
 *    Nicolas Bros (Mia-Software) - Bug 380407 - Missing since tag on CustomizedContentProviderUtils
 *    Grégoire Dupé (Mia-Software) - Bug 506334 - Need to know which TreeElement has been updated
 *******************************************************************************/
package org.eclipse.modisco.facet.custom.ui;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.modisco.facet.custom.metamodel.v0_2_0.internal.treeproxy.EAttributeTreeElement;
import org.eclipse.modisco.facet.custom.metamodel.v0_2_0.internal.treeproxy.EObjectTreeElement;
import org.eclipse.modisco.facet.custom.metamodel.v0_2_0.internal.treeproxy.EReferenceTreeElement;
import org.eclipse.modisco.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeElement;

/**
 * A companion utility class for {@link ICustomizedTreeContentProvider}
 * 
 * @since 0.2
 */
public final class CustomizedContentProviderUtils {
	private CustomizedContentProviderUtils() {
		// utility class
	}

	/**
	 * Replace proxy objects by their underlying model elements in the given selection
	 * 
	 * @return the unwrapped version of the selection
	 */
	public static ISelection resolveSelection(final ISelection selection) {
		Assert.isNotNull(selection);
		ISelection result;
		if (selection instanceof IStructuredSelection) {
			final IStructuredSelection strSelection = (IStructuredSelection) selection;
			final List<Object> resolvedElements = new ArrayList<Object>();
			final Iterator<?> iterator = strSelection.iterator();
			while (iterator.hasNext()) {
				final Object element = iterator.next();
				resolvedElements.add(resolve(element));
			}
			result = new StructuredSelection(resolvedElements);
		} else {
			throw new IllegalArgumentException("Unhandled selection type: " + selection.getClass().getName()); //$NON-NLS-1$
		}
		return result;
	}

	/**
	 * Resolve the given UI element into the underlying model element.
	 * 
	 * @param element
	 *            a UI element, that may be a proxy for a model element
	 * @return the corresponding model element, or the given element if it is not a proxy
	 */
	public static Object resolve(final Object element) {
		Object resolved = element;
		if (element instanceof EObjectTreeElement) {
			resolved = ((EObjectTreeElement) element).getEObject();
		} else if (element instanceof EAttributeTreeElement) {
			resolved = ((EAttributeTreeElement) element).getEAttribute();
		} else if (element instanceof EReferenceTreeElement) {
			resolved = ((EReferenceTreeElement) element).getEReference();
		}
		return resolved;
	}

	/**
	 * @since 1.2
	 */
	public static EStructuralFeature getEStructuralFeature(final Object treeElt) {
		EStructuralFeature result = null;
		if (treeElt instanceof EReferenceTreeElement) {
			final EReferenceTreeElement refTreeElt = (EReferenceTreeElement) treeElt;
			result = refTreeElt.getEReference();
		}
		return result;
	}

	/**
	 * @since 1.2
	 */
	public static EObject getParentEObject(final Object object) {
		Object supposedTreeElt = null;
		if (!(object instanceof EObjectTreeElement)
				&& (object instanceof TreeElement)) {
			final TreeElement treeElt = (TreeElement) object;
			supposedTreeElt = treeElt.getParent();
		} else {
			supposedTreeElt = object;
		}
		return getEObject(supposedTreeElt);
	}

	/**
	 * @since 1.2
	 */
	public static EObject getEObject(final Object object) {
		EObject result = null;
		if (object instanceof EObjectTreeElement) {
			final EObjectTreeElement eObjTreeElt = (EObjectTreeElement) object;
			result = eObjTreeElt.getEObject();
		}
		return result;
	}
}
