/*******************************************************************************
 * 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) {
		this();
		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;
}