/*******************************************************************************
 * Copyright (c) 2011, 2019 Mia-Software and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Gregoire Dupe (Mia-Software) - Bug 366804 - [Restructuring] Table widget upgrade
 *    Grégoire Dupé (Mia-Software) - Bug 365843 - [Unit Test Failure][0.2/3.8][0.2/4.2] org.eclipse.modisco.facet.widgets.nattable.tests.swtbot.Bug344925Test.testBug344925
 *    Grégoire Dupé (Mia-Software) - Bug 367700 - [Unit Test Failure][0.2/3.8] org.eclipse.modisco.facet.widgets.table.tests.internal.v0_2.swtbot.NatTableUITests.testOpenLoadCustomizationDialog
 *    Grégoire Dupé (Mia-Software) - Bug 373078 - API Cleaning
 *******************************************************************************/
package org.eclipse.modisco.facet.util.emf.core;
import java.io.File;
import java.io.IOException;
import java.util.Collections;

import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.modisco.facet.util.core.DebugUtils;
import org.eclipse.modisco.facet.util.emf.core.exception.DebugRuntimeException;

/**
 * @since 0.2
 */
public final class EmfDebugUtils {

	private EmfDebugUtils() {
		// Must not be used
	}
	
	public static String debugCommand(final Command command) {
		return debugCommand(command, 1);
	}
	
	private static String debugCommand(final Command command, final int indent) {
		StringBuffer result = new StringBuffer();
		result.append('\n');
		for (int i = 0; i < indent; i++) {
			result.append("--"); //$NON-NLS-1$
		}
		result.append(command.getClass().getSimpleName());
		result.append(" \""); //$NON-NLS-1$
		result.append(command.getLabel());
		result.append("\" "); //$NON-NLS-1$
		result.append(" canExecute="); //$NON-NLS-1$
		result.append(command.canExecute());
		result.append(" ("); //$NON-NLS-1$
		result.append(command.getClass().getName());
		result.append(')');
		if (command instanceof CompoundCommand) {
			CompoundCommand compoundCommand = (CompoundCommand) command;
			for (Command subCommand : compoundCommand.getCommandList()) {
				result.append(debugCommand(subCommand, indent + 1));
			}
		}
		return result.toString();
	}
	
	/**
	 * This method can be used to easily dump a model into a file. This method has been written to be
	 * used by unit tests.
	 * 
	 * @param eObject
	 * @param fileExtension
	 * @return a string explaining where the file has been saved.
	 */
	public static String getStateDumpMessage(final EObject eObject, final String fileExtension) {
		final File file = new File(DebugUtils.getCallerLocation(1) + '.' + fileExtension);
		URI uri = URI.createFileURI(file.getAbsolutePath());
		ResourceSet resourceSet = new ResourceSetImpl();
		Resource resource = resourceSet.createResource(uri);
		resource.getContents().add(EcoreUtil.copy(eObject));
		try {
			resource.save(Collections.EMPTY_MAP);
		} catch (IOException e) {
			throw new DebugRuntimeException(e);
		}
		return "A model containing the dumped EObject has been saved in " + file.getAbsolutePath(); //$NON-NLS-1$
	}

}
