/*******************************************************************************
 * 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.metamodelimpl;



import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.Vector;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.wst.css.core.internal.Logger;
import org.eclipse.wst.css.core.internal.metamodel.CSSMetaModel;
import org.eclipse.wst.css.core.internal.metamodel.CSSProfile;
import org.osgi.framework.Bundle;



class CSSProfileImpl implements CSSProfile {

	/**
	 * Constructor for CSSMetaModelProfileInfoImpl.
	 */
	private CSSProfileImpl() {
		super();
	}

	/**
	 * Constructor for CSSMetaModelProfileInfoImpl.
	 */
	public CSSProfileImpl(String id, URL url) {
		super();
		fID = id;
		fURL = url;
	}

	/**
	 * Constructor for CSSMetaModelProfileInfoImpl.
	 */
	CSSProfileImpl(String id, URL url, String relativeURI) {
		super();
		fID = id;
		fURL = url;
		fRelativeURI = relativeURI;
	}

	/*
	 * @see CSSMetaModelProfileInfo#getProfileID()
	 */
	public String getProfileID() {
		return fID;
	}

	/*
	 * @see CSSMetaModelProfileInfo#getProfileName()
	 */
	public String getProfileName() {
		return (fName == null) ? fID : fName;
	}

	public CSSMetaModel getMetaModel() {
		if (fMetaModel == null) {
			try {
				InputStream input = getProfileURL().openStream();
				ProfileLoader loader = new ProfileLoader(getResourceBundle(), getLogging());
				fMetaModel = loader.loadProfile(input);
			}
			catch (IOException e) {
				Logger.logException("Cannot open stream for profile", e); //$NON-NLS-1$
			}
		}
		return fMetaModel;
	}

	private ResourceBundle getResourceBundle() {
		ResourceBundle resourceBundle = null;

		Bundle bundle = null;
		String pluginID = getOwnerPluginID();
		if (pluginID != null) {
			bundle = Platform.getBundle(pluginID);
			if (bundle != null) {
				// needed to work around FileLocator.openStream not looking for
				// files with Java naming conventions (BUG103345)
				IPath[] paths = getResourceBundlePaths();
				if (paths != null) {
					InputStream inStream = null;
					int i = 0;
					while (i < paths.length && inStream == null) {
						IPath path = paths[i];
						try {
							inStream = FileLocator.openStream(bundle, path, true);
							if (inStream != null)
								resourceBundle = new PropertyResourceBundle(inStream);
							else
								++i;
						}
						catch (IOException e) {
							// unable to open stream with current path so just
							// try next path
							++i;
						}
						finally {
							if (inStream != null)
								try {
									inStream.close();
								}
								catch (IOException e) {
									Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
								}
						}
					}
				}
			}
		}
		return resourceBundle;
	}

	/**
	 * Returns an array of potential resource bundle paths or null if there
	 * are none
	 * 
	 * @return IPath[] or null
	 */
	private IPath[] getResourceBundlePaths() {
		IPath[] paths = new IPath[0];

		if (fRelativeURI != null) {
			// original path = location of profile.xml - profile.xml
			IPath originalPath = Path.fromOSString(fRelativeURI).removeLastSegments(1);

			String baseName = "cssprofile"; //$NON-NLS-1$ 
			Vector names = calculateBundleNames(baseName, Locale.getDefault());

			int a = 0;
			paths = new IPath[names.size()];
			for (int i = names.size(); i > 0; --i) {
				String bundleName = (String) names.get(i - 1);
				IPath path = originalPath.append(bundleName).addFileExtension("properties"); //$NON-NLS-1$
				paths[a] = path;
				++a;
			}
		}
		return paths;
	}

	/**
	 * Calculate the bundles along the search path from the base bundle to the
	 * bundle specified by baseName and locale.<br />
	 * 
	 * @param baseName
	 *            the base bundle name
	 * @param locale
	 *            the locale
	 * @param names
	 *            the vector used to return the names of the bundles along the
	 *            search path.
	 * 
	 */
	private Vector calculateBundleNames(String baseName, Locale locale) {
	    // this method can be deleted after BUG103345 is fixed
		final Vector result = new Vector(4); // default size 4
		final String language = locale.getLanguage();
		final int languageLength = language.length();
		final String country = locale.getCountry();
		final int countryLength = country.length();
		final String variant = locale.getVariant();
		final int variantLength = variant.length();

		result.addElement(baseName); // at least add base name
		if (languageLength + countryLength + variantLength == 0) {
			// The locale is "", "", "".
			return result;
		}
		final StringBuffer temp = new StringBuffer(baseName);
		temp.append('_');
		temp.append(language);
		if (languageLength > 0) {
			result.addElement(temp.toString());
		}

		if (countryLength + variantLength == 0) {
			return result;
		}
		temp.append('_');
		temp.append(country);
		if (countryLength > 0) {
			result.addElement(temp.toString());
		}

		if (variantLength == 0) {
			return result;
		}
		temp.append('_');
		temp.append(variant);
		result.addElement(temp.toString());

		return result;
	}

	/*
	 * @see CSSMetaModelProfileInfo#getProfileURL()
	 */
	public URL getProfileURL() {
		return fURL;
	}

	void setProfileName(String name) {
		fName = name;
	}

	public boolean isDefault() {
		return fDefault;
	}

	void setDefault(boolean isDefault) {
		fDefault = isDefault;
	}

	public String getOwnerPluginID() {
		return fOwnerPluginID;
	}

	void setOwnerPluginID(String pluginID) {
		fOwnerPluginID = pluginID;
	}

	/**
	 * hidden option : logging
	 */
	void setLogging(boolean logging) {
		fLogging = logging;
	}

	boolean getLogging() {
		return fLogging;
	}


	String fID = null;
	String fName = null;
	URL fURL = null;
	CSSMetaModel fMetaModel = null;
	String fOwnerPluginID = null;
	boolean fDefault = false;
	boolean fLogging = false;
	private String fRelativeURI = null;
}