/*******************************************************************************
 * Copyright (c) 2004, 2013 IBM Corporation and others.
 * Copyright (C) 2007, Martin Oberhuber (martin.oberhuber@windriver.com)
 * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
 * Copyright (C) 2009, Mykola Nikishov <mn@mn.com.ua>
 * Copyright (C) 2010, Wim Jongman <wim.jongman@remainsoftware.com>
 * Copyright (C) 2010, Benjamin Muskalla <bmuskalla@eclipsesource.com>
 * Copyright (C) 2011, Mathias Kinzler <mathias.kinzler@sap.com>
 *
 * 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
 *******************************************************************************/

package org.eclipse.egit.ui.internal.clone;

import java.io.File;

import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.util.NLS;

/**
 * Used for creating projects out of .project files
 */
public class ProjectRecord {
	private final File projectSystemFile;

	private String projectName;

	private IProjectDescription description;

	/**
	 * Create a record for a project based on the info in the file.
	 *
	 * @param file
	 */
	public ProjectRecord(File file) {
		projectSystemFile = file;
		IPath path = new Path(projectSystemFile.getPath());
		try {
			// If the file is in the default location, use the directory
			// name as the project name. Otherwise we will get an error like
			// "foo overlaps the location of another project foo" when importing
			// in case the directory name and the name in .project do not match.
			if (isDefaultLocation(path)) {
				projectName = path.segment(path.segmentCount() - 2);
				description = ResourcesPlugin.getWorkspace()
						.newProjectDescription(projectName);
			} else {
				description = ResourcesPlugin.getWorkspace()
						.loadProjectDescription(path);
				projectName = description.getName();
			}
		} catch (CoreException e) {
			description = null;
			projectName = path.lastSegment();
		}
	}

	/**
	 * Get the name of the project
	 *
	 * @return String
	 */
	public String getProjectName() {
		return projectName;
	}

	/**
	 * Gets the label to be used when rendering this project record in the UI.
	 *
	 * @return String the label
	 */
	public String getProjectLabel() {
		String path = projectSystemFile.getParent();

		return NLS.bind("{0} ({1})", projectName, path); //$NON-NLS-1$
	}

	/**
	 * @return the project description
	 */
	public IProjectDescription getProjectDescription() {
		return description;
	}

	/**
	 * @param description
	 */
	public void setProjectDescription(IProjectDescription description) {
		this.description = description;
	}

	/**
	 * @return the file used in the constructor
	 */
	public File getProjectSystemFile() {
		return projectSystemFile;
	}

	@Override
	public String toString() {
		return projectName;
	}

	/**
	 * Returns whether the given project description file path is in the default
	 * location for a project
	 *
	 * @param path
	 *            The path to examine
	 * @return Whether the given path is the default location for a project
	 */
	private boolean isDefaultLocation(IPath path) {
		// The project description file must at least be within the project,
		// which is within the workspace location
		if (path.segmentCount() < 2)
			return false;
		return path.removeLastSegments(2).toFile()
				.equals(Platform.getLocation().toFile());
	}

}