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

import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
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 EntityMockQualifiedNameProvider extends XbaseQualifiedNameProvider {

	@Inject
	private IQualifiedNameConverter qualifiedNameConverter;

	@Override
	public QualifiedName getFullyQualifiedName(EObject obj) {
		if (obj == null) {
			return QualifiedName.create("");
		}
//		if (obj instanceof CCTable) {
//			CCTable table = (CCTable) obj;
//            if (table.getName() == null) {
//            	return null;
//            }
//            return qualifiedNameConverter.toQualifiedName(table.getName());
//		}
//		if (obj instanceof CCEntityMockObjectArrayValue) {
//			CCEntityMockObjectArrayValue x = (CCEntityMockObjectArrayValue)obj;
//		    EObject xx = EcoreUtil3.resolve(x.getEnums(), x.getEnums().eResource().getResourceSet());
//			
//			
//			
//			QualifiedName fqn = qualifiedNameConverter.toQualifiedName(((CCEntityMockObjectArrayValue)obj).getEnums().getName());
//			fqn = fqn;
//		}
		QualifiedName fqn = super.getFullyQualifiedName(obj);

//		if	((fqn == null) && (obj instanceof CCEntityMockObjectItemValue)) {
//			CCEntityMockObjectEnumValue enumName = ((CCEntityMockObjectItemValue)obj).getItem();
//			if	(enumName != null) {
//				String name = enumName.getName();
//				if	(name != null) {
//					fqn = qualifiedNameConverter.toQualifiedName(name);
//				}
//			}
//		}
//			CCEntityMockObjectEnumValue enumValue = ((CCEntityMockObjectItemValue)obj).getItem();
//			CCEntityMockObjectItemValue ivo = ((CCEntityMockObjectItemValue)obj);
//	
//			
//			if	(enumValue != null) {
//				getCrossReferenceName(enumValue, EntityMockDSLPackage.Literals.CC_ENTITY_MOCK_OBJECT_ITEM_VALUE__ITEM);
//				fqn = getFullyQualifiedName(obj.eContainer()).append(enumValue.getName());
//			}
//			
//		}
//		System.out.println(obj.getClass().getSimpleName()+" --> "+(fqn == null ? "<NULL>" : fqn.toString()));
		return fqn;
	}

//	// 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 CCTablePackage)) {
//			o = o.eContainer();
//		}
//		return ((CCTablePackage)o).getName();
//	}
}
