/**
 * Copyright (c) 2013, 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:
 *     Gregoire Dupe (Mia-Software) - Bug 406578 - Generic Label Provider for EMF objects
 */
package org.eclipse.modisco.facet.util.emf.ui.internal;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.modisco.facet.util.emf.core.ModelUtils;
import org.eclipse.modisco.facet.util.emf.ui.internal.utils.ImageProvider;
import org.eclipse.modisco.facet.util.emf.ui.internal.utils.ImageUtils;
import org.eclipse.swt.graphics.Image;

public class EmfLabelProvider extends LabelProvider {

	@Override
	public String getText(final Object element) {
		String result = super.getText(element);
		if (element instanceof ResourceSet) {
			final ResourceSet resourceSet = (ResourceSet) element;
			result = getResourceSetLabel(resourceSet);
		} else if (element instanceof Resource) {
			final Resource resource = (Resource) element;
			result = getResourceLabel(resource);
		} else if (element instanceof EObject) {
			final EObject eObject = (EObject) element;
			result = ModelUtils.getName(eObject);
		} else if (element instanceof IAdaptable) {
			final IAdaptable adaptable = (IAdaptable) element;
			result = adaptAndGetResourceLabel(adaptable);
			if (result == null) {
				result = adaptAndGetResourceSetLabel(adaptable);
			}
		} else {
			result = element.toString();
		}
		return result;
	}

	private static String adaptAndGetResourceLabel(final IAdaptable adaptable) {
		String result = null;
		final Resource resource = (Resource) adaptable
				.getAdapter(Resource.class);
		if (resource != null) {
			result = getResourceLabel(resource);
		}
		return result;
	}

	private static String adaptAndGetResourceSetLabel(final IAdaptable adaptable) {
		String result = null;
		final ResourceSet resourceSet = (ResourceSet) adaptable
				.getAdapter(ResourceSet.class);
		if (resourceSet != null) {
			result = getResourceSetLabel(resourceSet);
		}
		return result;
	}

	private static String getResourceSetLabel(final ResourceSet resourceSet) {
		String result;
		result = ResourceSet.class.getSimpleName() + ' '
				+ resourceSet.hashCode();
		return result;
	}

	private static String getResourceLabel(final Resource resource) {
		String result;
		EObject firstRoot = null;
		if (resource.getContents().size() > 0) {
			firstRoot = resource.getContents().get(0);
		}
		final StringBuffer strBuffer = new StringBuffer();
		final URI uri = resource.getURI();
		final String lastSegment = uri.lastSegment();
		strBuffer.append(lastSegment);
		if (firstRoot != null) {
			strBuffer.append(" - "); //$NON-NLS-1$
			final EPackage ePackage = firstRoot.eClass().getEPackage();
			final String nsURI = ePackage.getName();
			strBuffer.append(nsURI);
		}
		if (resource.isModified()) {
			strBuffer.append(" *"); //$NON-NLS-1$
		}
		result = strBuffer.toString();
		return result;
	}

	@Override
	public Image getImage(final Object element) {
		Image result = super.getImage(element);
		if (element instanceof Resource) {
			final Resource resource = (Resource) element;
			result = getResourceImage(resource);
		} else if (element instanceof IAdaptable) {
			final IAdaptable adaptable = (IAdaptable) element;
			result = adaptAndGetResourceImage(adaptable);
		} else if (element instanceof EObject) {
			final EObject eObject = (EObject) element;
			result = ImageUtils.getImage(eObject);
		}
		return result;
	}

	private static Image adaptAndGetResourceImage(final IAdaptable adaptable) {
		Image result = null;
		final Resource resource = (Resource) adaptable
				.getAdapter(Resource.class);
		if (resource != null) {
			result = getResourceImage(resource);
		}
		return result;
	}

	private static Image getResourceImage(final Resource resource) {
		Image result = null;
		if (resource.getContents().size() > 0) {
			final EObject firstRoot = resource.getContents().get(0);
			result = ImageUtils.getImage(firstRoot);
			if (result == null) {
				result = ImageProvider.DEFAULT.getImage(ImageProvider.MODEL);
			}
		}
		return result;
	}

}
