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

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.epf.library.edit.LibraryEditPlugin;
import org.eclipse.epf.library.edit.uma.ExtendReferenceMap;
import org.eclipse.epf.library.edit.util.MethodElementPropUtil;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Practice;

public class ChangeUdtCommand extends MethodElementSetPropertyCommand {
	
	private boolean remove = false;
	private List<Practice> items;
	private Set<Practice> affectedSet = new HashSet<Practice>();
	
	public ChangeUdtCommand(MethodElement element, List<Practice> items, boolean remove) {
		super(element, MethodElementPropUtil.Me_references);
		this.items = items;
		this.remove = remove;
	}

	@Override
	public void redo() {
		MethodElementPropUtil propUtil = MethodElementPropUtil.getMethodElementPropUtil();		
		List<Practice> listValue = propUtil.getUdtList(element, true);
		if (listValue == null || items == null || items.isEmpty()) {
			return;
		}		

		for (Practice p : items) {
			if (remove) {
				if (listValue.remove(p)) {
					affectedSet.add(p);
					propUtil.removeOpposite(ExtendReferenceMap.UtdList, element, p);
				}
			} else {
				if (! listValue.contains(p) && listValue.add(p)) {
					affectedSet.add(p);
					propUtil.addOpposite(ExtendReferenceMap.UtdList, element, p);
				}
			}	
		}
		try {
			this.value = propUtil.getReferencesXml(this.element, false);
		} catch (Exception e) {
			LibraryEditPlugin.getDefault().getLogger().logError(e);
		}		
		super.redo();
	}
		
	@Override
	public void undo() {
		MethodElementPropUtil propUtil = MethodElementPropUtil.getMethodElementPropUtil();	
		try {
			for (Practice p : affectedSet) {
				if (remove) {
					propUtil.addOpposite(ExtendReferenceMap.UtdList, element, p);	
				} else {
					propUtil.removeOpposite(ExtendReferenceMap.UtdList, element, p);	
				}	
			}
			this.value = propUtil.getReferencesXml(this.element, true);
		} catch (Exception e) {
			LibraryEditPlugin.getDefault().getLogger().logError(e);
		}	
		super.undo();
	}
	
}
