/*****************************************************************************
 * Copyright (c) 2014, 2017 CEA LIST.
 *
 *
 * 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:
 *  Patrick Tessier (CEA LIST) patrick.tessier@cea.fr - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.papyrus.revision.tool.handlers;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.compare.AttributeChange;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
import org.eclipse.papyrus.infra.services.edit.service.ElementEditServiceUtils;
import org.eclipse.papyrus.infra.services.edit.service.IElementEditService;
import org.eclipse.papyrus.revision.tool.core.I_ReviewStereotype;
import org.eclipse.papyrus.revision.tool.core.ReviewResourceManager;
import org.eclipse.papyrus.revision.tool.ui.ReviewsEditor;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Stereotype;

/**
 * This handler is used to refuse a review from the review editor.
 */
public class RefuseReviewHandler extends RevisionAbstractHandler {
	/**
	 * The constructor.
	 */
	public RefuseReviewHandler() {
	}

	/**
	 * the command has been executed, so extract extract the needed information
	 * from the application context.
	 */
	public Object execute(ExecutionEvent event) throws ExecutionException {
		final ArrayList<Element> elements=getSelectionSet();
		final IWorkbenchPart part=PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
		if( part instanceof ReviewsEditor){
			if( elements.size()!=0){

				RecordingCommand cmd= new RecordingCommand(((ReviewsEditor)part).getReviewResourceManager().getDomain(), "Refuse currentReview") {
					@Override
					protected void doExecute() {
						for (Element element : elements) {

							Stereotype reviewtoDo= element.getAppliedStereotype(I_ReviewStereotype.TODO_STEREOTYPE);
							if(reviewtoDo!=null ){
								String diffuriFragment=(String)element.getValue(reviewtoDo, I_ReviewStereotype.COMMENT_DIFFREF_ATT);
								if( diffuriFragment!=null){

									//load EObject
									EObject eOject=element.eResource().getEObject(diffuriFragment);
									if(eOject instanceof ReferenceChange  ){
										ReferenceChange referenceChange= (ReferenceChange)eOject;
										//refuse Remove
										if( referenceChange.getKind().equals(DifferenceKind.DELETE)){
											refuseDELETE(part, element, referenceChange);
										}
										//refuse ADD
										else if( referenceChange.getKind().equals(DifferenceKind.ADD)){
											refuseADD(part, element, referenceChange);

										}
									}
									//refuse Set
									else if(eOject instanceof Match ){
										ReviewResourceManager r=((ReviewsEditor)part).getReviewResourceManager();
										if(((Match)eOject).getDifferences().size()>0){
											Diff diff=((Match)eOject).getDifferences().get(0);
											if( diff instanceof AttributeChange){
												Object oldValue= ((AttributeChange)diff).getValue();
												EStructuralFeature feature=((AttributeChange)diff).getAttribute();
												Command cmd=SetCommand.create(r.getDomain(), ((Match)eOject).getLeft(), feature, oldValue);
												cmd.execute();
												Match modelMatch=r.getDiffModel().getMatch(r.getWorkingModel());
												modelMatch.getSubmatches().remove(((Match)eOject));
											}
											else if (diff instanceof ReferenceChange){
												ReferenceChange referenceChange= (ReferenceChange)diff;
												//refuse Remove
												if( referenceChange.getKind().equals(DifferenceKind.DELETE)){
													EObject oldValue= referenceChange.getValue();
													EStructuralFeature feature=referenceChange.getReference();

													if(feature.isMany()){
														@SuppressWarnings("unchecked")
														List<EObject> set=(List<EObject>)((Match)eOject).getLeft().eGet(feature);
														set.add(oldValue);
														executeSeCommand(eOject, r, feature, set,element);
													}
													else{
														executeSeCommand(eOject, r, feature, oldValue, element);
													}
												}
												//refuse ADD
												else if( referenceChange.getKind().equals(DifferenceKind.ADD)){
													Object oldValue= referenceChange.getValue();
													EStructuralFeature feature=referenceChange.getReference();

													if(feature.isMany()){
														@SuppressWarnings("unchecked")
														List<EObject> set=(List<EObject>)((Match)eOject).getLeft().eGet(feature);
														set.remove(oldValue);
														executeSeCommand(eOject, r, feature, set, element);
													}
													else{
														executeSeCommand(eOject, r, feature, oldValue, element);
													}
												}
											}

										}
									}

								}

							}
						}

					}


				};
				((ReviewsEditor)part).getReviewResourceManager().getDomain().getCommandStack().execute(cmd);
			}
		}
		return null;
	}
	protected void refuseDELETE(final IWorkbenchPart part, Element element,
			ReferenceChange referenceChange) {
		ReviewResourceManager r=((ReviewsEditor)part).getReviewResourceManager();
		Match modelMatch=r.getDiffModel().getMatch(r.getWorkingModel());
		modelMatch.getDifferences().remove(referenceChange);
		((Element)element.eContainer()).getOwnedComments().remove(element);
	}

	protected void refuseADD(final IWorkbenchPart part, Element element, ReferenceChange referenceChange) {
		ReviewResourceManager r=((ReviewsEditor)part).getReviewResourceManager();
		EObject eObjectToRemove=referenceChange.getValue();
		refuseDELETE(part, element, referenceChange);
		DestroyElementRequest destroyrequest= new DestroyElementRequest(false); 
		destroyrequest.setEditingDomain(r.getDomain());
		destroyrequest.setElementToDestroy(eObjectToRemove);
		IElementEditService  provider = ElementEditServiceUtils.getCommandProvider(eObjectToRemove);
		if(provider != null) {
			// Retrieve delete command from the Element Edit service
			ICommand deleteCommand = provider.getEditCommand(destroyrequest);
			if(deleteCommand != null) {
				try {
					deleteCommand.execute(new NullProgressMonitor(), null);
				} catch (Exception e) {
					System.err.println(e);
				}
			}
		}
	}

	protected void executeSeCommand(EObject eOject, ReviewResourceManager r, EStructuralFeature feature, Object set,Element element) {
		SetRequest request= new SetRequest(((Match)eOject).getLeft(), feature, set);
		request.setEditingDomain(r.getDomain());
		IElementEditService  provider = ElementEditServiceUtils.getCommandProvider(eOject);
		if(provider != null) {
			// Retrieve delete command from the Element Edit service
			ICommand cmd = provider.getEditCommand(request);
			if(cmd != null) {
				try {
					cmd.execute(new NullProgressMonitor(), null);
				} catch (Exception e) {
					System.err.println(e);
				}
			}
		}
		Match modelMatch=r.getDiffModel().getMatch(r.getWorkingModel());
		modelMatch.getSubmatches().remove(((Match)eOject));
		((Element)element.eContainer()).getOwnedComments().remove(element);
	}

}
