/**
 *                                                                            
 * 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.basic.validation;

import java.util.Map;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.validation.ValidationMessageAcceptor;

import com.google.common.collect.Maps;

public class NamesAreUniqueValidationHelper extends org.eclipse.xtext.validation.NamesAreUniqueValidationHelper implements INamesAreUniqueValidationHelper {

	protected final INamesAreUniqueValidationClassComparator classComparator;
	
	public NamesAreUniqueValidationHelper(INamesAreUniqueValidationClassComparator classComparator) {
		this.classComparator = classComparator;
	}
	
	@Override
	protected void checkDescriptionForDuplicatedName(
			IEObjectDescription description,
			Map<EClass, Map<QualifiedName, IEObjectDescription>> clusterTypeToName,
			ValidationMessageAcceptor acceptor) {
		EObject object = description.getEObjectOrProxy();
		EClass eClass = object.eClass();
		QualifiedName qualifiedName = description.getName();
		EClass clusterType = getAssociatedClusterType(eClass);
		Map<QualifiedName, IEObjectDescription> nameToDescription = clusterTypeToName.get(clusterType);
		if (nameToDescription == null) {
			nameToDescription = Maps.newHashMap();
			nameToDescription.put(qualifiedName, description);
			clusterTypeToName.put(clusterType, nameToDescription);
		} else {
			if (nameToDescription.containsKey(qualifiedName)) {
				IEObjectDescription prevDescription = nameToDescription.get(qualifiedName);
				// !!! only if the description is not equal vvv
				if	(!description.equals(prevDescription)) {
				// ^^^ only if the description is not equal !!!
					if (prevDescription != null) {
						EObject prevObject = prevDescription.getEObjectOrProxy();
						if	(classComparator.areOfEqualClass(object, prevObject)) {
							createDuplicateNameError(prevDescription, clusterType, acceptor);
							nameToDescription.put(qualifiedName, null);
							createDuplicateNameError(description, clusterType, acceptor);
						}
					}
				}
			} else {
				nameToDescription.put(qualifiedName, description);
			}
		}
	}
	
	@Override
	protected void createDuplicateNameError(IEObjectDescription description, EClass clusterType, ValidationMessageAcceptor acceptor) {
		EObject object = description.getEObjectOrProxy();
		EStructuralFeature feature = getNameFeature(object);
		// !!! only if a feature is available vvv
		if	(feature != null) {
		// ^^^ only if a feature is available !!!
			acceptor.acceptError(
					getDuplicateNameErrorMessage(description, clusterType, feature), 
					object, 
					feature,
					ValidationMessageAcceptor.INSIGNIFICANT_INDEX,
					getErrorCode());
		}
	}
}
