package bndtools.wizards.workspace;

import java.io.File;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;

class LocationSelection {

	static final LocationSelection WORKSPACE = new LocationSelection(true, null);

	LocationSelection(boolean eclipseWorkspace, String externalPath) {
		this.eclipseWorkspace = eclipseWorkspace;
		this.externalPath = eclipseWorkspace ? null : externalPath;
	}

	boolean	eclipseWorkspace;
	String	externalPath;

	/**
	 * return a non-null error string in case of error
	 */
	String validate() {
		if (!eclipseWorkspace) {
			if (externalPath == null || externalPath.trim()
				.length() == 0)
				return "Location must be specified";
			if (!Path.EMPTY.isValidPath(externalPath))
				return "Invalid location.";

			File dir = new File(externalPath);
			if (dir.exists() && !dir.isDirectory())
				return "Location already exists and is not a directory.";
		}
		return null;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (eclipseWorkspace ? 1231 : 1237);
		result = prime * result + ((externalPath == null) ? 0 : externalPath.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		LocationSelection other = (LocationSelection) obj;
		if (eclipseWorkspace != other.eclipseWorkspace)
			return false;
		if (externalPath == null) {
			if (other.externalPath != null)
				return false;
		} else if (!externalPath.equals(other.externalPath))
			return false;
		return true;
	}

	public File toFile() {
		if (eclipseWorkspace)
			return ResourcesPlugin.getWorkspace()
				.getRoot()
				.getLocation()
				.toFile();
		return new File(externalPath);
	}

}
