/*******************************************************************************
 * Copyright (c) 2012-2013 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:
 ******************************************************************************/
package org.eclipse.emf.emfstore.client.test.persistence;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.File;
import java.io.IOException;

import junit.framework.Assert;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.emfstore.client.ESLocalProject;
import org.eclipse.emf.emfstore.client.ESProject;
import org.eclipse.emf.emfstore.client.test.WorkspaceTest;
import org.eclipse.emf.emfstore.internal.client.importexport.ExportImportControllerExecutor;
import org.eclipse.emf.emfstore.internal.client.importexport.ExportImportControllerFactory;
import org.eclipse.emf.emfstore.internal.client.importexport.impl.ExportImportDataUnits;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.junit.Test;

public class ImportExportTest extends WorkspaceTest {

	@Override
	protected void configureCompareAtEnd() {
		setCompareAtEnd(false);
	}

	@Test
	public void testExportImportChangesController() throws IOException {
		final ProjectSpace clonedProjectSpace = ModelUtil.clone(getProjectSpace());
		createTestElement("A");
		Assert.assertTrue(getProjectSpace().getOperations().size() > 0);

		// TODO: assert file extension is correct

		final File temp = File.createTempFile("changes", ExportImportDataUnits.Change.getExtension());
		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Export.getExportChangesController(getProjectSpace()));

		// TODO: assert file was written

		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Import.getImportChangesController(clonedProjectSpace));

		Assert.assertTrue(ModelUtil.areEqual(getProjectSpace().getProject(), clonedProjectSpace.getProject()));
	}

	@Test
	public void testExportImportProjectController() throws IOException {
		createTestElement("A");
		Assert.assertTrue(getProjectSpace().getOperations().size() > 0);

		// TODO: assert file extension is correct

		final File temp = File.createTempFile("project", ExportImportDataUnits.Project.getExtension());
		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Export.getExportProjectController(getProjectSpace()));

		// TODO: assert file was written

		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Import.getImportProjectController("importedProject"));

		ProjectSpace newProjectSpace = null;

		for (final ESProject project : ESWorkspaceProviderImpl.getInstance().getWorkspace().getLocalProjects()) {
			if (project.getProjectName().equals("importedProject")) {
				newProjectSpace = getProjectSpace();
				break;
			}
		}

		assertTrue(newProjectSpace != null);
	}

	@Test
	public void testDuplicateImportOfProjectSpace() throws IOException {
		final String tmpDir = System.getProperty("java.io.tmpdir") + "ieTest" + System.currentTimeMillis();
		final File tmpDirFile = new File(tmpDir);
		final boolean bo = tmpDirFile.mkdir();

		if (!bo) {
			fail("Could not create temp folder for test");
		}

		final File temp = File.createTempFile("projectSpace", ExportImportDataUnits.ProjectSpace.getExtension(),
			tmpDirFile);
		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Export.getExportProjectSpaceController(getProjectSpace()));

		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Import.getImportProjectSpaceController());
		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Import.getImportProjectSpaceController());

		Assert.assertEquals(3, ESWorkspaceProviderImpl.getInstance().getWorkspace().getLocalProjects().size());
		final ProjectSpace projectSpace = ESWorkspaceProviderImpl.getInstance().getInternalWorkspace()
			.getProjectSpaces().get(1);
		final ProjectSpace projectSpace2 = ESWorkspaceProviderImpl.getInstance().getInternalWorkspace()
			.getProjectSpaces().get(2);
		assertFalse(projectSpace.getIdentifier().equals(projectSpace2.getIdentifier()));
	}

	@Test
	public void testExportImportProjectSpaceController() throws IOException {
		createTestElement("A");
		Assert.assertTrue(getProjectSpace().getOperations().size() > 0);

		final String tmpDir = System.getProperty("java.io.tmpdir") + "ieTest" + System.currentTimeMillis();
		final File tmpDirFile = new File(tmpDir);
		final boolean bo = tmpDirFile.mkdir();

		if (!bo) {
			fail("Could not create temp folder for test");
		}

		// TODO: assert file extension is correct

		final File temp = File.createTempFile("projectSpace", ExportImportDataUnits.ProjectSpace.getExtension(),
			tmpDirFile);
		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Export.getExportProjectSpaceController(getProjectSpace()));

		// TODO: assert file was written

		new ExportImportControllerExecutor(temp, new NullProgressMonitor())
			.execute(ExportImportControllerFactory.Import.getImportProjectSpaceController());

		Assert.assertEquals(2, ESWorkspaceProviderImpl.getInstance().getWorkspace().getLocalProjects().size());

		final ESLocalProject a = ESWorkspaceProviderImpl.getInstance().getWorkspace().getLocalProjects().get(0);
		final ESLocalProject b = ESWorkspaceProviderImpl.getInstance().getWorkspace().getLocalProjects().get(1);

		// TODO: are the imported IDs supposed to be the same as in the original project?
		// Assert.assertTrue(ModelUtil.areEqual(a.getProject(), b.getProject()));
	}
}
