/*******************************************************************************
 * Copyright (c) 2015 EclipseSource Muenchen GmbH 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:
 *     Stefan Dirix - initial API and implementation
 *******************************************************************************/
package org.eclipse.papyrus.compare.diagram.tests.util;

import java.util.Map;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.papyrus.infra.core.resource.AbstractBaseModel;
import org.eclipse.papyrus.infra.core.resource.sasheditor.DiModel;
import org.eclipse.papyrus.infra.gmfdiag.common.model.NotationModel;
import org.eclipse.papyrus.uml.tools.model.UmlModel;

/**
 * Util class to access the save parameters of Papyrus.
 * 
 * @author Stefan Dirix <sdirix@eclipsesource.com>
 */
public final class PapyrusSaveParameterUtil {

	/**
	 * No public constructor for util classes.
	 */
	private PapyrusSaveParameterUtil() {
	}

	/**
	 * Returns the save parameter for UML model files used by Papyrus.
	 * 
	 * @return A collection of save parameters.
	 */
	public static Map<Object, Object> getUMLSaveParameter() {
		final UMLSaveParametersHelper helper = new UMLSaveParametersHelper();
		return helper.getSaveParametersForTest();
	}

	/**
	 * Returns the save parameter for DI model files used by Papyrus.
	 * 
	 * @return A collection of save parameters.
	 */
	public static Map<Object, Object> getDISaveParameter() {
		final DISaveParametersHelper helper = new DISaveParametersHelper();
		return helper.getSaveParametersForTest();
	}

	/**
	 * Returns the save parameter for Notation model files used by Papyrus.
	 * 
	 * @return A collection of save parameters.
	 */
	public static Map<Object, Object> getNotationSaveParameter() {
		final NotationSaveParametersHelper helper = new NotationSaveParametersHelper();
		return helper.getSaveParametersForTest();
	}

	/**
	 * Returns the default parameter for abstract model files offered by Papyrus.
	 * 
	 * @return A collection of save parameters.
	 */
	public static Map<Object, Object> getDefaultSaveParameter() {
		final DefaultSaveParametersHelper helper = new DefaultSaveParametersHelper();
		return helper.getSaveParametersForTest();
	}

	/**
	 * Helper class to retrieve the save parameters of Papyrus uml models.
	 */
	private static class UMLSaveParametersHelper extends UmlModel {
		public Map<Object, Object> getSaveParametersForTest() {
			return super.getSaveOptions();
		}
	}

	/**
	 * Helper class to retrieve the save parameters of Papyrus di models.
	 */
	private static class DISaveParametersHelper extends DiModel {
		public Map<Object, Object> getSaveParametersForTest() {
			return super.getSaveOptions();
		}
	}

	/**
	 * Helper class to retrieve the save parameters of Papyrus notation models.
	 */
	private static class NotationSaveParametersHelper extends NotationModel {
		public Map<Object, Object> getSaveParametersForTest() {
			return super.getSaveOptions();
		}
	}

	/**
	 * Helper class to retrieve the save parameters of Papyrus abstract base models.
	 */
	private static class DefaultSaveParametersHelper extends AbstractBaseModel {
		@Override
		protected String getModelFileExtension() {
			return null;
		}

		@Override
		public String getIdentifier() {
			return null;
		}

		public Map<Object, Object> getSaveParametersForTest() {
			return super.getSaveOptions();
		}

		// since Papyrus 2.0 we have to implement canPersist
		// we omit @Override on purpose to be backward compatible
		@SuppressWarnings("all")
		public boolean canPersist(EObject eObject) {
			return false;
		}

		// since Papyrus 2.0 we have to implement persist
		// we omit @Override on purpose to be backward compatible
		@SuppressWarnings("all")
		public void persist(EObject object) {
			// no implementation
		}
	}

	/**
	 * Tests if two save parameter maps are equal. Since some options use objects as values an ordinary
	 * {@link Map#equals(Object)} will always return {@code false}. These options are checked manually, the
	 * "normal" options are checked via {@link Map#equals(Object)}
	 * 
	 * @param saveParameters1
	 *            Save parameter map to compare.
	 * @param saveParameters2
	 *            Save parameter map to compare.
	 * @return {@code true} if the given parameter are equal, {@code false} otherwise.
	 */
	public static boolean isEqual(final Map<?, ?> saveParameters1, final Map<?, ?> saveParameters2) {
		// Check URI Handler manually since the value is a dynamic object
		if (saveParameters1.containsKey(XMLResource.OPTION_URI_HANDLER)) {
			final Object uriHandler1 = saveParameters1.get(XMLResource.OPTION_URI_HANDLER);
			final Object uriHandler2 = saveParameters2.get(XMLResource.OPTION_URI_HANDLER);

			if (uriHandler1 != null && uriHandler2 != null) {
				if (!uriHandler1.getClass().equals(uriHandler2.getClass())) {
					return false;
				}
				saveParameters1.remove(XMLResource.OPTION_URI_HANDLER);
				saveParameters2.remove(XMLResource.OPTION_URI_HANDLER);
			}
		}
		return saveParameters1.equals(saveParameters2);
	}
}
