/*******************************************************************************
 * Copyright (c) 2004 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.wst.css.core.internal.util;



import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;

/**
 * 
 */
public class CSSPathService {

	// Constants
	private static final String FILEURLSCHEME = "file";//$NON-NLS-1$
	private static final String URLCOLON = ":"; //$NON-NLS-1$
	private static final String FILEURLPREFIX = FILEURLSCHEME + URLCOLON + "//";//$NON-NLS-1$
	private static final String URLSEPARATOR = "/"; //$NON-NLS-1$

	/**
	 * @return java.lang.String
	 */
	public static String getAbsoluteURL(IStructuredModel baseModel, String ref) {
		String absLink = URLModelProviderCSS.resolveURI(baseModel, ref, true);
		String url = absLink;
		if (absLink != null) { // if it has not scheme, we must add "file"
								// scheme
			try {
				new java.net.URL(absLink);
			}
			catch (java.net.MalformedURLException e) {
				IPath path = new Path(absLink);
				if (path != null)
					url = toURL(path);
			}
		}
		return url;
	}

	/**
	 * 
	 * @return org.eclipse.core.resources.IFile
	 * @param location
	 *            java.lang.String
	 */
	public static IFile location2File(String location) {
		Path path = new Path(location);
		IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
		if (file == null && path.segmentCount() > 1)
			file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
		return file;
	}

	/**
	 * Gets a file URL for the path.
	 */
	private static String toURL(IPath path) {
		path = new Path(path.toFile().getAbsolutePath());
		if (path.isUNC() == true) {
			// it's UNC. return file://host/foo/bar/baz.html
			return FILEURLSCHEME + URLCOLON + path.toString();
		}
		return FILEURLPREFIX + URLSEPARATOR + path.toString();
	}
}