/*******************************************************************************
 * Copyright (c) 2011, 2016 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.help.ui.internal.preferences;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.help.internal.HelpPlugin;
import org.eclipse.help.internal.base.IHelpBaseConstants;
import org.eclipse.help.ui.internal.HelpUIPlugin;
import org.osgi.service.prefs.BackingStoreException;


public class ICPreferences {

	public final static String DELIMITER = ","; //$NON-NLS-1$


	public static void setICs(List<IC> ics)
	{
		String name = "", host = "", path = "", protocol="", port = "", enabled = ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$

		for (int i=0;i<ics.size();i++)
		{
			name += ics.get(i).getName() + DELIMITER;
			protocol += ics.get(i).getProtocol() + DELIMITER;
			host += ics.get(i).getHost() + DELIMITER;
			port += ics.get(i).getPort() + DELIMITER;
			path += ics.get(i).getPath() + DELIMITER;
			enabled += ics.get(i).isEnabled() + DELIMITER;
		}

		// Remove trailing commas
		if(ics.size()!=0)
		{
			name = name.substring(0,name.length()-1);
			protocol = protocol.substring(0,protocol.length()-1);
			host = host.substring(0,host.length()-1);
			port = port.substring(0,port.length()-1);
			path = path.substring(0,path.length()-1);
			enabled = enabled.substring(0,enabled.length()-1);
		}

		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_NAME, name); //$NON-NLS-1$
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_HOST, host); //$NON-NLS-1$
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PATH, path); //$NON-NLS-1$
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PROTOCOL, protocol); //$NON-NLS-1$
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PORT, port); //$NON-NLS-1$
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ICEnabled, enabled); //$NON-NLS-1$

		HelpPlugin.getTocManager().clearCache();
	}

	public static List<IC> getICs()
	{
		return prefsToICs(
				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_NAME).split(DELIMITER), //$NON-NLS-1$
				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PROTOCOL).split(DELIMITER), //$NON-NLS-1$
				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_HOST).split(DELIMITER), //$NON-NLS-1$
				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PORT).split(DELIMITER), //$NON-NLS-1$
				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PATH).split(DELIMITER), //$NON-NLS-1$
				ICPreferences.get("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ICEnabled).split(DELIMITER)); //$NON-NLS-1$
	}

	public static List<IC> prefsToICs(String names[],String protocols[],String hosts[],String ports[],String paths[],String states[])
	{
		List<IC> ics = new ArrayList<>();

		for (int i=0;i<names.length;i++)
		{
			if (!names[i].equals("")) //$NON-NLS-1$
			{
				try {
					IC ic = new IC(
						names[i],
						(protocols.length>i ? protocols[i] : "http") + "://" + //$NON-NLS-1$ //$NON-NLS-2$
						hosts[i]+":"+ //$NON-NLS-1$
						ports[i]+
						paths[i],
						"true".equalsIgnoreCase(states[i])); //$NON-NLS-1$
					ics.add(ic);
				} catch (MalformedURLException e) {
					HelpUIPlugin.logError(e.getMessage(), e);
				}
			}
		}
		return ics;
	}



	public static List<IC> getDefaultICs()
	{
		return prefsToICs(
				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_NAME).split(DELIMITER), //$NON-NLS-1$
				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PROTOCOL).split(DELIMITER), //$NON-NLS-1$
				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_HOST).split(DELIMITER), //$NON-NLS-1$
				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PORT).split(DELIMITER), //$NON-NLS-1$
				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PATH).split(DELIMITER), //$NON-NLS-1$
				getDefault("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ICEnabled).split(DELIMITER)); //$NON-NLS-1$
	}


	/**
	 * Returns a default preference for the given name
	 *
	 * @param plugin - Name of the plugin containing this preference
	 * @param name - Name of the preference to retrieve
	 * @return value, or empty string if no preference found
	 */
	public static String getDefault(String plugin,String name)
	{
		return getDefaultNode(plugin).get(name, ""); //$NON-NLS-1$
	}

	public static void setRemoteHelp(boolean enabled)
	{
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_ON,enabled+""); //$NON-NLS-1$ //$NON-NLS-2$
		HelpPlugin.getTocManager().clearCache();
	}

	public static void setRemoteHelpPreferred(boolean remotePreferred)
	{
		set("org.eclipse.help.base",IHelpBaseConstants.P_KEY_REMOTE_HELP_PREFERRED,remotePreferred+""); //$NON-NLS-1$ //$NON-NLS-2$
		HelpPlugin.getTocManager().clearCache();
	}

	/**
	 * Sets a preference
	 *
	 * @param plugin - Name of the plugin containing this preference
	 * @param name - Name of the preference
	 * @param value - Value to set
	 */
	public static void set(String plugin,String name,String value)
	{
		set(getNode(plugin),name,value);
	}

	/**
	 * Set a preference in the given node.
	 *
	 * @param node
	 * @param name
	 * @param value
	 */
	public static void set(IEclipsePreferences node,String name,String value)
	{
		node.put(name, value);
		try {
			node.flush();
		} catch (BackingStoreException e) {} //Nothing we can do, move on
	}

	/**
	 * Returns the preference found for the given name
	 *
	 * @param plugin - Name of the plugin containing this preference
	 * @param name - Name of the preference to retrieve
	 * @return value, or empty string if no preference found
	 */
	public static String get(String plugin,String name)
	{
		return getNode(plugin).get(name, ""); //$NON-NLS-1$
	}

	/**
	 * Get the IEclipsePreferences node for the given plugin
	 *
	 * @param plugin
	 * @return
	 */
	public static IEclipsePreferences getNode(String plugin)
	{
		IEclipsePreferences p = InstanceScope.INSTANCE.getNode(plugin);
		return p;
	}


	/**
	 * Get the default IEclipsePreferences node for the given plugin
	 *
	 * @param plugin
	 * @return
	 */
	public static IEclipsePreferences getDefaultNode(String plugin)
	{
		IEclipsePreferences p = DefaultScope.INSTANCE.getNode(plugin);
		return p;
	}
}
