//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.configuration.closure;

import org.eclipse.epf.library.LibraryResources;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.VariabilityType;
import org.eclipse.epf.uma.WorkProduct;

/**
 * define the configuration error level metrix
 * 
 * @author Jinhua Xi
 * @author Weiping Lu
 * @since 1.2
 *
 */
public class ConfigurationErrorMatrix {
	
//	private static List level1Features = new ArrayList();
//	private static List level2Features = new ArrayList();
//	private static List level3Features = new ArrayList();
//	static {
//		level2Features.add(UmaPackage.eINSTANCE.getTask_PerformedBy());
//	}
	
//	MethodConfiguration config;
//	public ConfigurationErrorMatrix(MethodConfiguration config) {
//		this.config = config;
//	}
	
	public static ElementError getError(MethodConfiguration config, ElementReference ref) {
		
		if ( ref.hasFeature(UmaPackage.eINSTANCE.getVariabilityElement_VariabilityBasedOnElement()) ) {
			return getVariabilityError(config, ref);
		} 
		
		int errorLevel = ErrorInfo.INFO;
		String messageId = LibraryResources.ElementError_missing_element;
		
		MethodElement e = (MethodElement)ref.getElement();
		MethodElement e_ref = (MethodElement)ref.getRefElement();

		if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_MandatoryInput()) ) {
			errorLevel = ErrorInfo.ERROR;
			messageId = LibraryResources.ElementError_missing_mandatory_input;
		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_Output()) ) {
			errorLevel = ErrorInfo.ERROR;
			messageId = LibraryResources.ElementError_missing_output;
		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_PerformedBy()) ) {
			errorLevel = ErrorInfo.WARNING;
			messageId = LibraryResources.ElementError_missing_primary_performer;
		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getRole_ResponsibleFor()) ) {
			errorLevel = ErrorInfo.WARNING;
			messageId = LibraryResources.ElementError_missing_responsible_for_workProduct;
		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy()) 
				|| ref.hasFeature(UmaPackage.eINSTANCE.getTask_OptionalInput()) 
				|| ref.hasFeature(UmaPackage.eINSTANCE.getRole_Modifies())
				 ) {
			// default
		} else if ( isBreakdownReference(e, e_ref) ) {
			errorLevel = ErrorInfo.INFO;
		} else if( isGuidanceReference(e, e_ref) ) {
			// default
		} else {
			return null;
		}

		String message = LibraryResources.bind(messageId, 
				(new String[] {LibraryUtil.getTypePath(e), 
						LibraryUtil.getTypePath(e_ref) }));

		return new ElementError(config, errorLevel, message, e, e_ref, ErrorInfo.REFERENCE_TO, messageId);
	}
	
	private static boolean isBreakdownReference(MethodElement e, MethodElement e_ref) {
		return (e_ref instanceof Task || e_ref instanceof Role || e_ref instanceof WorkProduct) 
			&& (e instanceof BreakdownElement);
	}
	
	private static boolean isGuidanceReference(MethodElement e, MethodElement e_ref) {
		return (e instanceof Task || e instanceof Role || e instanceof WorkProduct) 
			&& (e_ref instanceof Guidance);
	}
	
	private static ElementError getVariabilityError(MethodConfiguration config, ElementReference ref) {
	
		VariabilityElement e = (VariabilityElement)ref.getElement();
		VariabilityElement e_ref = (VariabilityElement)ref.getRefElement();
		
		if ( e.getVariabilityBasedOnElement() != e_ref ) {
			return null;
		}
		
		VariabilityType type = e.getVariabilityType();
		
		int errorLevel = ErrorInfo.WARNING;
		String messageId = LibraryResources.ElementError_missing_element;

		if ( type == VariabilityType.CONTRIBUTES ) {
			if ( e instanceof ContentCategory || e instanceof Guidance ) {
				errorLevel = ErrorInfo.INFO;
			}
			
			messageId = LibraryResources.ElementError_contributor_missing_base;
		} else if ( type == VariabilityType.EXTENDS ) {
			messageId = LibraryResources.ElementError_extender_missing_base;
			
		} else if ( type == VariabilityType.REPLACES 
				|| type == VariabilityType.EXTENDS_REPLACES) {
			messageId = LibraryResources.ElementError_replacer_missing_base;
		}
		
		String message = LibraryResources.bind(messageId, 
				(new String[] {LibraryUtil.getTypePath(e), 
						LibraryUtil.getTypePath(e_ref) }));

		return new ElementError(config, errorLevel, message, e, e_ref, ErrorInfo.REFERENCE_TO, messageId);
	}
}
