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

import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.osbp.xtext.reportdsl.Report;
import org.eclipse.osbp.xtext.reportdsl.ReportPackage;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.xbase.scoping.XbaseQualifiedNameProvider;

import com.google.inject.Inject;


@SuppressWarnings("restriction")
public class ReportQualifiedNameProvider extends XbaseQualifiedNameProvider {

	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;

	@Override
	public QualifiedName getFullyQualifiedName(EObject obj) {
		if (obj == null) {
			return QualifiedName.create("");
		}
		if (obj instanceof Report) {
			Report report = (Report) obj;
            if (report.getName() == null) {
            	return null;
            }
            return qualifiedNameConverter.toQualifiedName(report.getName());
		}
		return super.getFullyQualifiedName(obj);
	}

	// this method evaluates the cross referenced name of an object without causing cyclic lazy linking errors
	private String getCrossReferenceName(EObject obj, EStructuralFeature feature) {
		List<INode> nodes = NodeModelUtils.findNodesForFeature(obj, feature);
		if (nodes.size() == 0) {
			return null;
		}
		return NodeModelUtils.getTokenText(nodes.get(0));
	}

	private String getPackageName(EObject obj) {
		EObject o = obj.eContainer();
		while(!(o instanceof ReportPackage)) {
			o = o.eContainer();
		}
		return ((ReportPackage)o).getName();
	}
}
