/*******************************************************************************
 * Copyright (c) 2008, 2013 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0, which accompanies this distribution
 * and is available at https://www.eclipse.org/legal/epl-2.0/.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.ui.internal.platform.generic;

import org.eclipse.core.resources.IResource;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jpt.common.ui.internal.jface.ModelItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.internal.jface.NullItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.internal.jface.StaticItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.jface.ItemExtendedLabelProvider;
import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
import org.eclipse.jpt.jpa.core.JpaModel;
import org.eclipse.jpt.jpa.core.context.JpaContextRoot;
import org.eclipse.jpt.jpa.core.context.ManagedType;
import org.eclipse.jpt.jpa.core.context.PersistentAttribute;
import org.eclipse.jpt.jpa.core.context.PersistentType;
import org.eclipse.jpt.jpa.core.context.java.JarFile;
import org.eclipse.jpt.jpa.core.context.orm.OrmXml;
import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
import org.eclipse.jpt.jpa.core.jpa2_1.context.ConverterType2_1;
import org.eclipse.jpt.jpa.ui.JptJpaUiImages;
import org.eclipse.jpt.jpa.ui.JptJpaUiMessages;
import org.eclipse.jpt.jpa.ui.internal.structure.MappingStructureItemLabelProviderFactory;
import org.eclipse.jpt.jpa.ui.internal.structure.PersistenceStructureItemLabelProviderFactory;

/**
 * This factory builds item label providers for the JPA content in the
 * Common Navigator.
 */
public class GenericNavigatorItemLabelProviderFactory
	implements ItemExtendedLabelProvider.Factory
{
	// singleton
	private static final ItemExtendedLabelProvider.Factory INSTANCE = new GenericNavigatorItemLabelProviderFactory();

	/**
	 * Return the singleton
	 */
	public static ItemExtendedLabelProvider.Factory instance() {
		return INSTANCE;
	}


	private GenericNavigatorItemLabelProviderFactory() {
		super();
	}

	public ItemExtendedLabelProvider buildProvider(Object item, ItemExtendedLabelProvider.Manager manager) {
		if (item instanceof JpaContextRoot) {
			return this.buildJpaContextRootProvider((JpaContextRoot) item, manager);
		}
		if (item instanceof PersistenceXml) {
			return this.buildPersistenceXmlProvider((PersistenceXml) item, manager);
		}
		if (item instanceof PersistenceUnit) {
			return this.buildPersistenceUnitProvider((PersistenceUnit) item, manager);
		}
		if (item instanceof OrmXml) {
			return this.buildOrmXmlProvider((OrmXml) item, manager);
		}
		if (item instanceof PersistentType) {
			return this.buildPersistentTypeProvider((PersistentType) item, manager);
		}
		if (item instanceof ConverterType2_1) {
			return this.buildConverterTypeProvider((ManagedType) item, manager);
		}
		if (item instanceof PersistentAttribute) {
			return this.buildPersistentAttributeProvider((PersistentAttribute) item, manager);
		}
		if (item instanceof JarFile) {
			return this.buildJarFileProvider((JarFile) item, manager);
		}
		return NullItemExtendedLabelProvider.instance();
	}

	protected ItemExtendedLabelProvider buildJpaContextRootProvider(JpaContextRoot item, ItemExtendedLabelProvider.Manager manager) {
		return new StaticItemExtendedLabelProvider(
				JptJpaUiImages.JPA_CONTENT,
				JptJpaUiMessages.JPA_CONTENT_LABEL,
				JptJpaUiMessages.JPA_CONTENT_LABEL + " - " + item.getResource().getFullPath().makeRelative(), //$NON-NLS-1$
				manager
			);
	}

	protected ItemExtendedLabelProvider buildPersistenceXmlProvider(PersistenceXml item, ItemExtendedLabelProvider.Manager manager) {
		return this.buildResourceItemLabelProvider(item, manager);
	}

	protected ItemExtendedLabelProvider buildPersistenceUnitProvider(PersistenceUnit item, ItemExtendedLabelProvider.Manager manager) {
		return PersistenceStructureItemLabelProviderFactory.buildPersistenceUnitProvider(item, manager);
	}

	protected ItemExtendedLabelProvider buildOrmXmlProvider(OrmXml item, ItemExtendedLabelProvider.Manager manager) {
		return this.buildResourceItemLabelProvider(item, manager);
	}

	protected ItemExtendedLabelProvider buildPersistentTypeProvider(PersistentType item, ItemExtendedLabelProvider.Manager manager) {
		return MappingStructureItemLabelProviderFactory.buildPersistentTypeProvider(item, manager);
	}

	protected ItemExtendedLabelProvider buildConverterTypeProvider(ManagedType item, ItemExtendedLabelProvider.Manager manager) {
		return new ModelItemExtendedLabelProvider(
				item,
				manager,
				this.buildConverterTypeImageDescriptorModel(item),
				this.buildConverterTypeTextModel(item),
				this.buildConverterTypeDescriptionModel(item)
			);
	}

	protected PropertyValueModel<ImageDescriptor> buildConverterTypeImageDescriptorModel(@SuppressWarnings("unused") ManagedType item) {
		return new StaticPropertyValueModel<ImageDescriptor>(JptJpaUiImages.CONVERTER);
	}

	protected PropertyValueModel<String> buildConverterTypeTextModel(ManagedType managedType) {
		return new ConverterTypeTextModel(managedType);
	}

	public static class ConverterTypeTextModel
		extends PropertyAspectAdapter<ManagedType, String>
	{
		public ConverterTypeTextModel(ManagedType subject) {
			super(ManagedType.NAME_PROPERTY, subject);
		}
		@Override
		protected String buildValue_() {
			return this.subject.getSimpleName();
		}
	}

	@SuppressWarnings("unchecked")
	protected PropertyValueModel<String> buildConverterTypeDescriptionModel(ManagedType managedType) {
		return PersistenceStructureItemLabelProviderFactory.buildNonQuotedComponentDescriptionModel(
					managedType,
					this.buildConverterTypeTextModel(managedType)
				);
	}

	protected ItemExtendedLabelProvider buildPersistentAttributeProvider(PersistentAttribute item, ItemExtendedLabelProvider.Manager manager) {
		return MappingStructureItemLabelProviderFactory.buildPersistentAttributeProvider(item, manager);
	}

	protected ItemExtendedLabelProvider buildJarFileProvider(JarFile item, ItemExtendedLabelProvider.Manager manager) {
		return this.buildResourceItemLabelProvider(item, JptJpaUiImages.JAR_FILE, manager);
	}

	protected ItemExtendedLabelProvider buildResourceItemLabelProvider(JpaModel node, ItemExtendedLabelProvider.Manager manager) {
		return this.buildResourceItemLabelProvider(node.getResource(), manager);
	}

	protected ItemExtendedLabelProvider buildResourceItemLabelProvider(JpaModel node, ImageDescriptor imageDescriptor, ItemExtendedLabelProvider.Manager manager) {
		return this.buildResourceItemLabelProvider(node.getResource(), imageDescriptor, manager);
	}

	protected ItemExtendedLabelProvider buildResourceItemLabelProvider(IResource resource, ItemExtendedLabelProvider.Manager manager) {
		return this.buildResourceItemLabelProvider(resource, JptJpaUiImages.JPA_FILE, manager);
	}

	protected ItemExtendedLabelProvider buildResourceItemLabelProvider(IResource resource, ImageDescriptor imageDescriptor, ItemExtendedLabelProvider.Manager manager) {
		return new StaticItemExtendedLabelProvider(
					imageDescriptor,
					resource.getName(),
					this.buildResourceDescription(resource),
					manager
				);
	}

	protected String buildResourceDescription(IResource resource) {
		StringBuilder sb = new StringBuilder();
		sb.append(resource.getName());
		sb.append(" - ");  //$NON-NLS-1$
		sb.append(resource.getParent().getFullPath().makeRelative());
		return sb.toString();
	}
}
