package org.yakindu.base.types.resource;

import java.util.Map;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy;
import org.eclipse.xtext.util.IAcceptor;
import org.yakindu.base.types.EnumerationType;
import org.yakindu.base.types.Type;
import org.yakindu.base.types.TypeAlias;
import org.yakindu.base.types.TypedElement;

import com.google.common.collect.Maps;

public  class TypedResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy {

	/**
	 * This flag is true if the element has or contains elements with an unknown
	 * resp. unsupported type
	 */
	public static final String HAS_UNKNOWN_TYPE = "has_unknown_type";
	
	/**
	 * For types that are visible (<code>Type.isVisible()==true</code>) this
	 * flag is true, otherwise false
	 */
	public static final String IS_VISIBLE_TYPE = "is_visible_type";

	/**
	 * Type aliases whose original type is an enumeration type will have this
	 * flag set to true, otherwise this flag is missing
	 */
	public static final String IS_ALIAS_ON_ENUM = "is_alias_on_enum";
	
	/** 
	 * This flag indicates the if the type of a TypedElelemnt is complex or not
	 */
	public static final String HAS_COMPLEX_TYPE = "has_complex_type";

	
	public TypedResourceDescriptionStrategy() {
		super();
	}


	public boolean createEObjectDescriptions(EObject eObject, IAcceptor<IEObjectDescription> acceptor) {
		if (getQualifiedNameProvider() == null)
			return false;
		
		try {
			QualifiedName qualifiedName = getQualifiedNameProvider().getFullyQualifiedName(eObject);
			if (qualifiedName != null) {
				Map<String, String> userData = Maps.newHashMap();
				defineUserData(eObject, userData);
				acceptor.accept(EObjectDescription.create(qualifiedName, eObject, userData));
			}
		} catch (Exception exc) {
			exc.printStackTrace();
		}
		return true;
	}


	protected void defineUserData(EObject eObject, Map<String, String> userData) {
		if (eObject instanceof TypedElement) {
			userData.put(HAS_UNKNOWN_TYPE, String.valueOf(isUnknownType((TypedElement) eObject)));
			userData.put(HAS_COMPLEX_TYPE, String.valueOf(hasComplexType((TypedElement) eObject)));
		}
		if (eObject instanceof Type) {
			userData.put(IS_VISIBLE_TYPE, String.valueOf(((Type) eObject).isVisible()));
		}
		if (eObject instanceof TypeAlias) {
			if (((TypeAlias) eObject).getOriginType() instanceof EnumerationType) {
				userData.put(IS_ALIAS_ON_ENUM, String.valueOf(true));
			}
		}
	}


	
	protected boolean isUnknownType(TypedElement element) {
		return false;
	}

	
	protected boolean hasComplexType(TypedElement element) {
		return false ; //element.getType() instanceof ComplexType; 
	}
	

}
@@ -1404,71 +1404,9 @@
 e%22;%0A
-%0A%09%0A%09public TypedResourceDescriptionStrategy() %7B%0A%09%09super();%0A%09%7D%0A%0A
+%09
 %0A%09pu
@@ -1565,16 +1565,70 @@
 alse;%0A%09%09
+if(!shouldCreateDescription(eObject))%0A%09%09%09return false;
 %0A%09%09try %7B
@@ -2008,16 +2008,96 @@
 rue;%0A%09%7D%0A
+%09%0A%09protected boolean shouldCreateDescription(EObject object)%7B%0A%09%09return true;%0A%09%7D%0A
 %0A%0A%09prote

allow suppression of eobjects