/*******************************************************************************
 * Copyright (c) 2000, 2006 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.team.tests.ccvs.core.provider;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
import org.eclipse.team.tests.ccvs.core.EclipseTest;

/**
 * @version 	1.0
 * @author 	${user}
 */
public class ImportTest extends EclipseTest {

	/**
	 * Constructor for ImportTest.
	 */
	public ImportTest() {
		super();
	}

	/**
	 * Constructor for ImportTest.
	 * @param name
	 */
	public ImportTest(String name) {
		super(name);
	}

	public static Test suite() {
		TestSuite suite = new TestSuite(ImportTest.class);
		return new CVSTestSetup(suite);
		//return new CVSTestSetup(new ImportTest("testReadOnly"));
	}
	
	// Assert that the two containers have equal contents
	protected void assertEquals(IContainer container1, IContainer container2) throws CoreException {
		assertEquals(container1.getName(), container2.getName());
		List<IResource> members1 = new ArrayList<>();
		members1.addAll(Arrays.asList(container1.members()));
		members1.remove(container1.findMember("CVS"));
		
		List<IResource> members2 = new ArrayList<>();
		members2.addAll(Arrays.asList(container2.members()));
		members2.remove(container2.findMember("CVS"));
		
		assertTrue(members1.size() == members2.size());
		for (int i=0;i<members1.size();i++) {
			IResource member1 = members1.get(i);
			IResource member2 = container2.findMember(member1.getName());
			assertNotNull(member2);
			assertEquals(member1, member2);
		}
	}
	
	// Assert that the two files have equal contents
	protected void assertEquals(IFile file1, IFile file2) throws CoreException {
		assertEquals(file1.getName(), file2.getName());
		assertTrue(compareContent(file1.getContents(), file2.getContents()));
	}
	
	// Assert that the two projects have equal contents ignoreing the project name
	// and the .vcm_meta file
	protected void assertEquals(IProject container1, IProject container2) throws CoreException {
		List<IResource> members1 = new ArrayList<>();
		members1.addAll(Arrays.asList(container1.members()));
		members1.remove(container1.findMember(".project"));
		members1.remove(container1.findMember("CVS"));
		
		List<IResource> members2 = new ArrayList<>();
		members2.addAll(Arrays.asList(container2.members()));
		members2.remove(container2.findMember(".project"));
		members2.remove(container2.findMember("CVS"));
		
		assertTrue("Number of children differs for " + container1.getFullPath(), members1.size() == members2.size());
		for (int i=0;i<members1.size();i++) {
			IResource member1 = members1.get(i);
			IResource member2 = container2.findMember(member1.getName());
			assertNotNull(member2);
			assertEquals(member1, member2);
		}
	}
	protected void assertEquals(IResource resource1, IResource resource2) throws CoreException {
		assertEquals(resource1.getType(), resource2.getType());
		if (resource1.getType() == IResource.FILE)
			assertEquals((IFile)resource1, (IFile)resource2);
		else 
			assertEquals((IContainer)resource1, (IContainer)resource2);
	}
	
	public void testImportAndCheckout() throws TeamException, CoreException {
		// Create a test project and import it into cvs
		IProject project = getUniqueTestProject("testImport");
		buildResources(project, new String[] { "file1.txt", "folder1/", "folder1/a.txt" }, true);
		importProject(project);
		
		// Check it out under a different name and validate that the results are the same
		IProject copy = getWorkspace().getRoot().getProject(project.getName() + "Copy");
		checkout(getRepository(), copy, project.getName(), null, DEFAULT_MONITOR);
		assertValidCheckout(copy);
		assertEquals(project, copy);
	}
	
	public void testCheckout() throws TeamException, CoreException, IOException {
		// Create a project and checkout a copy
		IProject project = createProject("testCheckout", new String[] { "changed.txt", "deleted.txt", "folder1/", "folder1/a.txt" });
		IProject copy = checkoutCopy(project, "-copy");
		
		// 0. checkout the project again
		project = checkoutProject(project, null, null);
		assertEquals(project, copy, true, true);
		
		// 1. Delete the project but not it's contents and checkout the project again
		waitForDecorator();
		project.delete(false, false, DEFAULT_MONITOR);
		project = checkoutProject(project, null, null);
		assertEquals(project, copy, true, true);
		
		// 2. Delete the project and its contents and use the module name instead of the project
		waitForDecorator();
		project.delete(true, false, DEFAULT_MONITOR);
		project = checkoutProject(null, project.getName(), null);
		assertEquals(project, copy, true, true);
		
		// 3. Create a project in a custom location and check out over it
		waitForDecorator();
		project.delete(true, false, DEFAULT_MONITOR);
		IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(project.getName());
		//desc.setLocation(new Path("C:\\temp\\project"));
		project.create(desc, DEFAULT_MONITOR);
		project = checkoutProject(project, null, null);
		assertEquals(project, copy, true, true);
		
		// 4. Checkout something that doesn't contain a .project
		waitForDecorator();
		project.delete(true, false, DEFAULT_MONITOR);
		project = checkoutProject(null, project.getName() + "/folder1", null);
		//assertEquals(project, copy.getFolder("folder1"));
		

	}
	
	public void testRootShare() throws CoreException {
		// Create a test project 
		IProject project = getUniqueTestProject(getName());
		buildResources(project, new String[] { "file1.txt", "folder1/", "folder1/a.txt" }, true);
		// Share the project
		shareProject(getRepository(), project, null, DEFAULT_MONITOR);
		addResources(project, new String[] { "file1.txt", "folder1/", "folder1/a.txt" }, true);
		// Checkout a copy ans test
		IProject copy = checkoutProject(getUniqueTestProject(getName() + "copy"), project.getName(), null);
		assertEquals(project, copy);
	}
	
	public void testNonRootShare() throws CoreException {
		// Create a test project 
		IProject project = getUniqueTestProject(getName());
		buildResources(project, new String[] { "file1.txt", "folder1/", "folder1/a.txt" }, true);
		// Share it as a non-root folder in the repository
		String moduleName = "root" + Long.toString(System.currentTimeMillis()) + "/" + project.getName();
		shareProject(getRepository(), project, moduleName, DEFAULT_MONITOR);
		addResources(project, new String[] { "file1.txt", "folder1/", "folder1/a.txt" }, true);
		// Checkout a copy and test
		IProject copy = checkoutProject(getUniqueTestProject(getName() + "copy"), moduleName, null);
		assertEquals(project, copy);
	}
}
