/*******************************************************************************
 * Copyright (c) 2007, 2008 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
 *******************************************************************************/
package org.eclipse.equinox.internal.frameworkadmin.equinox.utils;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxConstants;
import org.eclipse.equinox.internal.provisional.frameworkadmin.LauncherData;
import org.eclipse.equinox.internal.provisional.frameworkadmin.Manipulator;

public class FileUtils {

	public static String getEclipseRealLocation(final Manipulator manipulator, final String location) {
		try {
			new URL(location);
			return location;
		} catch (MalformedURLException e) {
			// just ignore.
		}
		if (location.indexOf(":") >= 0)
			return location;

		LauncherData launcherData = manipulator.getLauncherData();
		File home = launcherData.getHome();
		File pluginsDir = null;
		if (home != null)
			pluginsDir = new File(home, EquinoxConstants.PLUGINS_DIR);
		else if (launcherData.getLauncher() != null)
			pluginsDir = new File(launcherData.getLauncher().getParentFile(), EquinoxConstants.PLUGINS_DIR);
		else if (launcherData.getFwJar() != null)
			pluginsDir = launcherData.getFwJar().getParentFile();
		String pluginName = getPluginName(location);
		String ret = getEclipsePluginFullLocation(pluginName, pluginsDir);
		return ret;
	}

	private static String getPluginName(final String location) {
		int position = location.indexOf("_");
		String pluginName = location;
		if (position >= 0)
			pluginName = location.substring(0, position);
		return pluginName;
	}

	public static String getRealLocation(Manipulator manipulator, final String location, boolean useEclipse) {
		if (location == null)
			return null;
		String ret = location;
		if (location.startsWith("reference:")) {
			ret = location.substring("reference:".length());
			if (ret.endsWith(".jar/")) {
				ret = ret.substring(0, ret.length() - "/".length());
				if (ret.startsWith("file:"))
					ret = ret.substring("file:".length());
			}
		}
		if (location.startsWith("initial@"))
			ret = location.substring("initial@".length());

		if (ret == location)
			return useEclipse ? FileUtils.getEclipseRealLocation(manipulator, location) : location;
		return getRealLocation(manipulator, ret, useEclipse);
	}

	private static String replaceAll(String st, String oldSt, String newSt) {
		if (oldSt.equals(newSt))
			return st;
		int index = -1;
		while ((index = st.indexOf(oldSt)) != -1) {
			st = st.substring(0, index) + newSt + st.substring(index + oldSt.length());
		}
		return st;
	}

	/**
	 * If a bundle of the specified location is in the Eclipse plugin format (either plugin-name_version.jar 
	 * or as a folder named plugin-name_version ), return version string.Otherwise, return null;
	 * 
	 * @param url
	 * @param pluginName
	 * @return version string. If invalid format, return null. 
	 */
	private static String getEclipseNamingVersion(URL url, final String pluginName, boolean isFile) {
		String location = url.getFile();
		location = replaceAll(location, File.separator, "/");
		String filename = null;
		if (location.indexOf(":") == -1)
			filename = location;
		else
			filename = location.substring(location.lastIndexOf(":") + 1);

		// filename must be "jarName"_"version".jar
		if (isFile) {
			if (!filename.endsWith(".jar"))
				return null;
			filename = filename.substring(0, filename.lastIndexOf(".jar"));
		} else {
			// directory - remove trailing slash
			filename = filename.substring(0, filename.length() - 1);
		}

		if (filename.indexOf("/") != -1)
			filename = filename.substring(filename.lastIndexOf("/") + 1);

		if (!filename.startsWith(pluginName))
			return null;

		int pluginnameLength = pluginName.length();
		if (filename.length() <= pluginnameLength || filename.charAt(pluginName.length()) != '_')
			return null;

		return filename.substring(pluginnameLength + 1);
	}

	public static String getEclipsePluginFullLocation(String pluginName, File bundlesDir) {
		if (bundlesDir == null)
			return null;
		File[] lists = bundlesDir.listFiles();
		URL ret = null;
		EclipseVersion maxVersion = null;
		if (lists == null)
			return null;

		for (int i = 0; i < lists.length; i++) {
			try {
				URL url = lists[i].toURL();
				String version = getEclipseNamingVersion(url, pluginName, lists[i].isFile());
				if (version != null) {
					EclipseVersion eclipseVersion = new EclipseVersion(version);
					if (maxVersion == null || eclipseVersion.compareTo(maxVersion) > 0) {
						ret = url;
						maxVersion = eclipseVersion;
					}
				}
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
		}
		return (ret == null ? null : ret.toExternalForm());
	}
}
