//------------------------------------------------------------------------------
// 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.edit.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodElementProperty;
import org.eclipse.epf.uma.UmaFactory;

/**
 * @author Phong Nguyen Le
 * @author Weiping Lu
 *
 * @since 1.2
 */
public class MethodElementPropertyHelper {
	public static final String WORK_ORDER__PREDECESSOR_PROCESS_PATH = "pred_process_path"; //$NON-NLS-1$
	public static final String CONFIG_PROPBLEM_HIDE_ERRORS = "hide_errors"; //$NON-NLS-1$
	public static final String CONFIG_PROPBLEM_HIDE_WARNINGS = "hide_warnings"; //$NON-NLS-1$
	public static final String CONFIG_PROPBLEM_HIDE_INFOS = "hide_infos"; //$NON-NLS-1$
	public static final String CUSTOM_CATEGORY__INCLUDED_ELEMENTS = "include"; //$NON-NLS-1$
	
	public static final MethodElementProperty getProperty(MethodElement e, String propertyName) {
		if (e != null) {
			for (Iterator iter = e.getMethodElementProperty().iterator(); iter.hasNext();) {
				MethodElementProperty prop = (MethodElementProperty) iter.next();
				if(prop.getName().equals(propertyName)) {
					return prop;
				}
			}
		}
		return null;
	}
	
	public static final void setProperty(MethodElement e, String propName, String propValue) {
		MethodElementProperty prop = getProperty(e, propName);
		if (prop == null) {
			prop = UmaFactory.eINSTANCE.createMethodElementProperty();
			prop.setName(propName);
			e.getMethodElementProperty().add(prop);
		}
		if (propValue != null && propValue.equals(prop.getValue())) return;
		if (propValue == null && prop.getValue() == null) return;
		prop.setValue(propValue);
	}

	public static final void setProperty(MethodElement e, String propName, boolean b) {
		setProperty(e, propName, String.valueOf(b));
	}

	public static final void removeProperty(MethodElement e, String propName) {
		MethodElementProperty property = getProperty(e, propName);
		if (property != null) {
			e.getMethodElementProperty().remove(property);
		}
	}
	
	public static final List<MethodElementProperty> getPropertyList(MethodElement e, String propertyName) {
		if (e == null) {
			return null;
		}		
		List<MethodElementProperty> allProps = e.getMethodElementProperty();		
		if (allProps == null || allProps.isEmpty()) {
			return null;
		}
	
		List<MethodElementProperty> propList = new ArrayList<MethodElementProperty>();
		for (MethodElementProperty prop: allProps) {
			if(prop.getName().equals(propertyName)) {
				propList.add(prop);
			}
		}

		return propList.isEmpty() ? null : propList;
	}
	
	public static final Map<String, List<MethodElementProperty>> getPropertyMap(MethodElement e, Collection<String> propertyNames) {
		Map propertyMap = new HashMap<String, List<MethodElementProperty>>();
		if (e == null || propertyNames == null || propertyNames.isEmpty()) {
			return propertyMap;
		}
	
		for (String propName: propertyNames) {
			List<MethodElementProperty> propList = getPropertyList(e, propName);
			propertyMap.put(propName, propList);
		}
		return propertyMap;
	}
	
}
