package org.eclipse.epf.library.edit.command;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;

import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
import org.eclipse.epf.library.edit.util.MethodElementPropertyHelper;
import org.eclipse.epf.library.edit.util.MethodElementPropertyMgr;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodElementProperty;
import org.eclipse.epf.uma.UmaPackage;

public class MethodElementSetPropertyCommand extends AbstractCommand implements
		IResourceAwareCommand {
	
	protected MethodElement element;
	protected String key;
	protected String value;
	protected String oldValue;
	protected Collection<Resource> modifiedResources;
	
	public MethodElementSetPropertyCommand(MethodElement element, String key, String value) {
		this.element = element;
		this.key = key;
		this.value = value;
	}

	protected boolean prepare() {
		// check if this operation will modify the element in opposite feature
		// value
		//
		return UserInteractionHelper.checkModifyOpposite(element, UmaPackage.Literals.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY,
				element);
	}

	public Collection<Resource> getModifiedResources() {
		if (element != null && element.eResource() != null
				&& modifiedResources == null) {
			modifiedResources = new HashSet<Resource>();
			modifiedResources.add(element.eResource());
		}
		
		if (modifiedResources == null) {
			return Collections.emptyList();
		}
		return modifiedResources;
	}

	public void execute() {
		redo();
	}

	public void redo() {
		MethodElementProperty oldProperty = MethodElementPropertyMgr.getInstance().getProperty(element, key);
		if (oldProperty != null) {
			oldValue = oldProperty.getValue();
		} else {
			oldValue = null;
		}
		MethodElementPropertyMgr.getInstance().setProperty(element, key, value);

	}
	
	@Override
	public void undo() {
		if (oldValue != null) {
			MethodElementPropertyHelper.setProperty(element, key, oldValue);
		} else {
			MethodElementPropertyHelper.removeProperty(element, key);
		}
	}

}
