/*******************************************************************************
 * Copyright (c) 2001, 2006 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.internal.util;



import java.io.File;
import com.ibm.icu.util.StringTokenizer;

/**
 * Collection of helper methods to manage and convert links Originally part of
 * the LinksManager 
 */
public class PathHelper {
	public static final String BACKWARD_SLASH = "\\";//$NON-NLS-1$

	public static final String FORWARD_SLASH = "/";//$NON-NLS-1$
	public static final String RELATIVE_PATH_SIG = "../";//$NON-NLS-1$

	/**
	 * adjust relative path isside the absolute path
	 */
	public static String adjustPath(String path) {
		int i = 0;
		while ((i = path.indexOf(RELATIVE_PATH_SIG)) > 0) {
			// split the string into two
			String part1 = path.substring(0, i - 1);
			String part2 = path.substring(i + RELATIVE_PATH_SIG.length() - 1);
			// strip one path seg from part1
			int j = part1.lastIndexOf(FORWARD_SLASH);
			if (j == -1) {
				// can't resolve. passed path is like
				// E:/eclipseproject/../../sample.css.
				return "";//$NON-NLS-1$
			}
			part1 = part1.substring(0, j);
			path = part1 + part2;
		}
		return path;
	}

	/**
	 * Append trailing url slash if needed
	 */
	public static String appendTrailingURLSlash(String input) {
		// check to see already a slash
		if (!input.endsWith(FORWARD_SLASH)) {
			input += FORWARD_SLASH;
		}
		return input;
	}

	/**
	 * Convert to relative url based on base
	 */
	public static String convertToRelative(String input, String base) {
		// tokenize the strings
		StringTokenizer inputTokenizer = new StringTokenizer(input, FORWARD_SLASH);
		StringTokenizer baseTokenizer = new StringTokenizer(base, FORWARD_SLASH);
		String token1 = "", token2 = "";//$NON-NLS-2$//$NON-NLS-1$
		//
		// Go through until equls
		while (true) {
			if (!inputTokenizer.hasMoreTokens() || !baseTokenizer.hasMoreTokens())
				break;
			token1 = baseTokenizer.nextToken();
			token2 = inputTokenizer.nextToken();
			if (!token1.equals(token2))
				break;
		}
		// now generate the backs
		String output = "";//$NON-NLS-1$
		while (baseTokenizer.hasMoreTokens()) {
			baseTokenizer.nextToken();
			output += "../"; //$NON-NLS-1$
		}
		output += token2;
		// generate the rest
		while (inputTokenizer.hasMoreTokens()) {
			output = output + FORWARD_SLASH + inputTokenizer.nextToken();
		}
		return output;
	}

	/**
	 * Return the containing folder path. Will handle both url and file path
	 */
	public static String getContainingFolderPath(String path) {
		String retValue = path;

		int urlSlashIndex = path.lastIndexOf(FORWARD_SLASH);
		int filePathSlashIndex = path.lastIndexOf(File.separator);
		int index = filePathSlashIndex;
		if (urlSlashIndex > filePathSlashIndex)
			index = urlSlashIndex;
		if (index >= 0)
			retValue = path.substring(0, index);
		return retValue;
	}

	/**
	 * Remove leading path separator
	 */
	public static String removeLeadingPathSeparator(String path) {
		if (path.startsWith(File.separator))
			path = path.substring(File.separator.length());
		return path;
	}

	/**
	 * Remove leading path separator
	 */
	public static String removeLeadingSeparator(String path) {
		if (path.startsWith(File.separator))
			path = path.substring(File.separator.length());
		else if (path.startsWith(FORWARD_SLASH) || path.startsWith(BACKWARD_SLASH))
			path = path.substring(FORWARD_SLASH.length());
		return path;
	}

	/**
	 * Switch to file path slashes
	 */
	public static String switchToFilePathSlashes(String path) {
		path = path.replace(FORWARD_SLASH.charAt(0), File.separatorChar);
		path = path.replace(BACKWARD_SLASH.charAt(0), File.separatorChar);
		return path;
	}

	/**
	 * Switch to file path slashes
	 */
	public static String switchToForwardSlashes(String path) {
		path = path.replace(File.separatorChar, FORWARD_SLASH.charAt(0));
		path = path.replace(BACKWARD_SLASH.charAt(0), FORWARD_SLASH.charAt(0));
		return path;
	}
}
