/**
 *                                                                            
 *  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.xtext.datamartdsl.valueconverter;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions;
import org.eclipse.osbp.dsl.semantic.common.types.LFeature;
import org.eclipse.osbp.dsl.semantic.common.types.LPackage;
import org.eclipse.osbp.dsl.semantic.common.types.LType;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;

import com.google.inject.Inject;

/**
 * The Class DatamartQualifiedNameProvider.
 */
@SuppressWarnings("restriction")
public class DatamartQualifiedNameProvider extends XbaseQualifiedNameProvider {

	/** The qualified name converter. */
	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;

	/** The extensions. */
	@Inject
	private ModelExtensions extensions;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider#
	 * getFullyQualifiedName(org.eclipse.emf.ecore.EObject)
	 */
	@Override
	public QualifiedName getFullyQualifiedName(EObject obj) {
		if (obj == null) {
			return QualifiedName.create("");
		}
		return super.getFullyQualifiedName(obj);
	}

	/**
	 * Gets the fqn.
	 *
	 * @param lfeature
	 *            the lfeature
	 * @return the fqn
	 */
	public QualifiedName getFQN(LFeature lfeature) {
		if (lfeature.getName() == null) {
			return QualifiedName.create("");
		}
		LType type = (LType) lfeature.eContainer();
		LPackage pkg = extensions.getPackage(type);
		if (pkg != null && type != null) {
			final String qualifiedName = String.format("%s.%s.%s", pkg.getName(), type.getName(), lfeature.getName());
			if (qualifiedName == null)
				return null;
			return qualifiedNameConverter.toQualifiedName(qualifiedName);
		} else {
			return lfeature.getName() != null ? qualifiedNameConverter.toQualifiedName(lfeature.getName()) : null;
		}
	}

}
