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;

public class ChangeQrCommand extends MethodElementSetPropertyCommand {
	
	private boolean remove = false;
	private List<MethodElement> items;
	private Set<MethodElement> affectedSet = new HashSet<MethodElement>();
	private String qualifierId;
	private String oppositeName;
	
	public ChangeQrCommand(MethodElement element, List<MethodElement> items, String qualifierId, boolean remove) {
		super(element, MethodElementPropUtil.Me_references);
		this.items = items;
		this.remove = remove;
		this.qualifierId = qualifierId;
		this.oppositeName = ExtendReferenceMap.getOppositeName(ExtendReferenceMap.getQReferenceNameById(qualifierId));
	}
	
	@Override
	public void redo() {
		MethodElementPropUtil propUtil = MethodElementPropUtil.getMethodElementPropUtil();		
		List<MethodElement> listValue = propUtil.getQReferenceListById(element, qualifierId, true);
		if (listValue == null || items == null || items.isEmpty()) {
			return;
		}		

		for (MethodElement p : items) {
			if (remove) {
				if (listValue.remove(p)) {
					affectedSet.add(p);
					propUtil.removeOpposite(oppositeName, element, p);
				}
			} else {
				if (! listValue.contains(p) && listValue.add(p)) {
					affectedSet.add(p);
					propUtil.addOpposite(oppositeName, 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 (MethodElement p : affectedSet) {
				if (remove) {
					propUtil.addOpposite(oppositeName, element, p);	
				} else {
					propUtil.removeOpposite(oppositeName, element, p);	
				}	
			}
			this.value = propUtil.getReferencesXml(this.element, true);
		} catch (Exception e) {
			LibraryEditPlugin.getDefault().getLogger().logError(e);
		}	
		super.undo();
	}
	
}
