/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * 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:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.ui.api.metadata;

import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.dsl.xtext.types.bundles.BundleSpaceTypeProvider;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.util.Pair;

/**
 * The Interface IDSLMetadataService.
 */
@SuppressWarnings("restriction")
public interface IDSLMetadataService {

	/**
	 * The Enum DSLLiterals avoids dependencies to the concrete DSL
	 * implementations.
	 */
	enum DSLLiterals {

		/** The perspective literal placeholder. */
		PERSPECTIVES
	}
	
	public static final class ThrowableMessages {
		private ThrowableMessages() {
		}
		public static final String NAMING_LOGIC_NOT_REGISTERD = "No registered naming logic for ";
	}

	/**
	 * Gets dsl grammar elements identified by a literal enum.
	 *
	 * @param literal
	 *            the literal
	 * @return iterator for dsl grammar elements
	 */
	@SuppressWarnings("rawtypes")
	List<Pair> getDslGrammarElementNames(IDSLMetadataService.DSLLiterals literal);

	/**
	 * Returns the EObject to be casted to the requested model for the given
	 * model id and EClass.
	 *
	 * @param id
	 *            the id
	 * @param eclass
	 *            the eclass
	 * @return the metadata
	 */
	EObject getMetadata(String id, EClass eclass);
	
	/**
	 * Returns the ecview id for the given Dialog.
	 * @param dialog
	 * @return
	 */
	String getECViewId(EObject dialog);

	/**
	 * Gets the all metadata descriptions.
	 *
	 * @param eClass
	 *            the e class
	 * @return the all descriptions
	 */
	Iterable<IEObjectDescription> getAllDescriptions(EClass eClass);

	/**
	 * Returns the fully qualified name for the given eObject. If the model is
	 * based on Xtext, then the returned fqn should be used from the
	 * EObjectDescription.
	 * 
	 * @param eObject
	 *            the EObject
	 * @return the fully qualified name
	 */
	String getFullyQualifiedName(EObject eObject);

	/**
	 * Returns the class name for the given eObject. Kind specifies which type
	 * of class should be returned. The types depend on their xtext inferrer.
	 * There may be kind "ui", "translator", "service",...<br>
	 * If you have no idea what should be returned, just leave the kind
	 * <code>null</code>.
	 *
	 * @param eObject
	 *            the EObject
	 * @param kind
	 *            the kind of requested class type. Depends on the underlying
	 *            model. Leave null for default.
	 * @return the class name
	 */
	String getClassName(EObject eObject, String kind);

	/**
	 * Returns all the classpath URI for a given extension.
	 *
	 * @param className
	 *            the class name
	 * @param extension
	 *            the extension
	 * @return the class uri
	 */
	String getClassURI(String className, String extension);

	/**
	 * Returns the class URI for the given eObject and kind. For kind see
	 * {@link #getClassName(EObject, String)}.
	 *
	 * @param eObject
	 *            the eObject
	 * @param kind
	 *            the kind
	 * @return the class URI
	 */
	String getClassURI(EObject eObject, String kind);

	/**
	 * Gets the class for the given eObject and extension.
	 *
	 * @param eObject the e object
	 * @param extension the extension
	 * @return the class
	 */
	Class<?> getClass(EObject eObject, String extension);
	/**
	 * Gets a class instance for the given eObject and extension.
	 *
	 * @param eObject the e object
	 * @param extension the extension
	 * @return the class instance
	 */
	Object getClassInstance(EObject eObject, String extension);
	
	/**
	 * Gets a resource URL from the bundle of the given extension.
	 *
	 * @param resourceName the resource name
	 * @param dslExtension the dsl extension e.g. report
	 * @return the resource URL
	 */
	URL getResourceURL(String resourceName, String dslExtension);
	
	/**
	 * Resolves the given proxy using the internal resource set.
	 * 
	 * @param proxy
	 *            the proxy instance
	 * @return resolved EObject
	 */
	EObject resolve(EObject proxy);

	/**
	 * Returns all resolved EObjects provided by
	 * {@link #getAllDescriptions(EClass)}.
	 *
	 * @param eClass
	 *            the e class
	 * @return the all EObjects
	 */
	Iterable<EObject> getAll(EClass eClass);

	/**
	 * Translates a fully qualified key for the given locale.
	 *
	 * @param locale
	 *            the locale
	 * @param key
	 *            the key
	 * @return the string
	 */
	String translate(String locale, String key);

	/**
	 * Gets all translations.
	 *
	 * @return the translations for all languages
	 */
	Map<String, Properties> getTranslations();

	/**
	 * Gets the bundle space type provider from MetadataBuilderService.
	 *
	 * @return the type provider
	 */
	BundleSpaceTypeProvider getTypeProvider();

	/**
	 * Returns a set with all sub types of the given type. The key holds the
	 * localized simple name if localeTag is != null The value holds the
	 * qualified name of the type
	 * 
	 * @param localeTag
	 *            the locale tag
	 * @param typeName
	 *            the type name
	 * @return all applicable type names
	 */
	Map<String, String> getAllTypeNames(String localeTag, String typeName);

	/**
	 * Creates an instance of the given qualified type.
	 *
	 * @param typeName
	 *            the type name
	 * @return the class
	 * @throws ClassNotFoundException
	 *             the class not found exception
	 */
	Class<?> createType(String typeName) throws ClassNotFoundException;
	
	/**
	 * Execute a unit of work via {@link IMetadataBuilderService}.
	 *
	 * @param <T> the generic type
	 * @param state the state
	 * @param unitOfWork the unit of work
	 */
	<T> void execute(T state, Object unitOfWork);

	/**
	 * Gets the root entity class of a datamart.
	 *
	 * @param canonicalName the canonical name of the datamart
	 * @return the entity root class
	 */
	Class<?> getDatamartRootClass(String canonicalName);
	String getDatamartRootClassIdentifierName(String canonicalName);
}
