package org.eclipse.epf.uma.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.epf.uma.ecore.IUserDefinedTypeMeta;

public class UserDefinedTypeMeta implements IUserDefinedTypeMeta {

	public static final UserDefinedTypeMeta noneValue = new UserDefinedTypeMeta();
	public static final String Type_Practice = "Practice";					//$NON-NLS-1$
	
	public static final String _typeName = "typeName";						//$NON-NLS-1$
	public static final String _typeId = "typeId";                                  //$NON-NLS-1$
	public static final String _problems = "problems";						//$NON-NLS-1$
	public static final String _goals = "goals";							//$NON-NLS-1$
	public static final String _background = "background";					//$NON-NLS-1$	
	public static final String _mainDescription = "mainDescription";		//$NON-NLS-1$	
	public static final String _application = "application"; 				//$NON-NLS-1$
	public static final String _levelsOfAdoption = "levelsOfAdoption"; 		//$NON-NLS-1$
	public static final String _additionalInfo = "additionalInfo"; 			//$NON-NLS-1$
	public static final String _icon = "icon";                              //$NON-NLS-1$
	public static final String _shapeIcon = "shapeIcon";                    //$NON-NLS-1$
	public static final String _referenceQualifiers = "referenceQualifiers";//$NON-NLS-1$
	public static final String _referenceQualifierNames = "referenceQualifierNames";//$NON-NLS-1$
	
	public static String[] rteNames = {
		_typeName,
		_typeId,
		_problems,
		_goals,
		_background,
		_mainDescription,
		_application,
		_levelsOfAdoption,
		_additionalInfo,
		_icon,
		_shapeIcon,
		_referenceQualifiers,
		_referenceQualifierNames
	};
		
	private Map<String, String> rteNameMap;
	
	private String id;
	
	private Set<EReference> qualifiedReferences;
	
	private boolean qualifiedReferencesLoaded = false;
	
	private Map<String, String> referenceQualifiedNameToIdMap;
	private Map<String, String> referenceQualifiedIdToNameMap;

	public static UserDefinedTypeMeta newPracticeUtdpeMeta(String typeId) {
		UserDefinedTypeMeta meta = new UserDefinedTypeMeta();
		meta.setId(getPracticeUdtId(typeId));
		return meta;
	}
	
	public static String getPracticeUdtId(String typeId) {
		return Type_Practice + ":" + typeId;			//$NON-NLS-1$
	}
					
	public UserDefinedTypeMeta() {
	}
	
	public Map<String, String> getRteNameMap() {
		if (rteNameMap == null) {
			rteNameMap  = new HashMap<String, String>();
		}
		return rteNameMap;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
	
	public boolean same(UserDefinedTypeMeta other) {
		if (other == null) {
			return false;
		}
		if (! same(this.id, other.id)) {
			return false;
		}
		for (String name : rteNames) {
			String thisValue = this.getRteNameMap().get(name);
			String otherValue = other.getRteNameMap().get(name);
			if (! same(thisValue, otherValue)) {
				return false;
			}
		}
		
		return true;
	}
	
	private boolean same(String a, String b) {
		if (a == null) {
			return b == null;
		} 
		return a.equals(b);
	}
		
	private List<String> convertStringsToList(String string) {
		ArrayList<String> strList = new ArrayList<String>();
		if (string == null)
			string = ""; //$NON-NLS-1$
		String strings[] = string
				.split("\\,"); 		//$NON-NLS-1$);
		for (int i = 0; i < strings.length; i++) {
			if (strings[i].trim().length() > 0)
				strList.add(strings[i].trim());
		}
		return strList;
	}
	
	public boolean isQualifiedRefernce(EReference ref) {
		return getQualifiedReferences().contains(ref);
	}
	
	public Set<EReference> getQualifiedReferences() {
		if (qualifiedReferences == null) {
			qualifiedReferences = new LinkedHashSet<EReference>();
		}
		String idStrValue = getRteNameMap().get(_referenceQualifiers);
		String nameStrValue = getRteNameMap().get(_referenceQualifierNames);
		if (idStrValue == null || idStrValue.trim().length() == 0) {
			qualifiedReferencesLoaded = false;
			if (!qualifiedReferences.isEmpty()) {
				qualifiedReferences.clear();
			}
		} else if (!qualifiedReferencesLoaded) {
			if (!qualifiedReferences.isEmpty()) {
				qualifiedReferences.clear();
			}
			List<String> refIds = convertStringsToList(idStrValue);
			List<String> refNames = convertStringsToList(nameStrValue);
			getReferenceQualifiedNameToIdMap().clear();
			getReferenceQualifiedIdToNameMap().clear();
			for (int i = 0; i < refIds.size(); i++) {
				String refId = refIds.get(i);
				String refName = refNames.get(i);
				getReferenceQualifiedNameToIdMap().put(refName, refId);
				getReferenceQualifiedIdToNameMap().put(refId, refName);
				EReference ref = EcoreFactory.eINSTANCE.createEReference();
				ref.setName(refId);
				qualifiedReferences.add(ref);
			}
			qualifiedReferencesLoaded = true;
		}
		return qualifiedReferences;
	}
	
	private Map<String, String>  getReferenceQualifiedNameToIdMap() {
		if (referenceQualifiedNameToIdMap == null) {
			referenceQualifiedNameToIdMap = new HashMap<String, String>();
		}
		return referenceQualifiedNameToIdMap;
	}

	private Map<String, String>  getReferenceQualifiedIdToNameMap() {
		if (referenceQualifiedIdToNameMap == null) {
			referenceQualifiedIdToNameMap = new HashMap<String, String>();
		}
		return referenceQualifiedIdToNameMap;
	}
	
	public String getReferenceQualifierName(String referenceQualifierId) {
		getQualifiedReferences();
		return getReferenceQualifiedIdToNameMap().get(referenceQualifierId);		
	}
		
	public String getReferenceQualifierId(String referenceQualifierName) {
		getQualifiedReferences();
		return getReferenceQualifiedNameToIdMap().get(referenceQualifierName);		
	}
	
}
