/*******************************************************************************
 * Copyright (c) 2009, 2017 xored software, Inc. and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.utils;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.dltk.core.DLTKCore;
import org.osgi.service.prefs.BackingStoreException;

/**
 * @since 2.0
 */
public class DLTKLogging {

	private static DLTKDebugOptions debugOptions = null;

	@SuppressWarnings("serial")
	private static class DLTKDebugOptions extends HashSet<String> {

		public DLTKDebugOptions() {
			super();
		}

		public DLTKDebugOptions(DLTKDebugOptions source) {
			super(source);
		}

	}

	private static synchronized DLTKDebugOptions getDebugOptions() {
		if (debugOptions == null) {
			debugOptions = new DLTKDebugOptions();
			final String loggingOptions = InstanceScope.INSTANCE
					.getNode(DLTKCore.PLUGIN_ID)
					.get(DLTKCore.LOGGING_OPTIONS, null);
			if (loggingOptions != null) {
				for (String option : TextUtils.split(loggingOptions,
						DLTKCore.LOGGING_OPTION_SEPARATOR)) {
					debugOptions.add(option);
				}
			}
		}
		return debugOptions;
	}

	private static synchronized void setDebugOptions(
			DLTKDebugOptions debugOptions) {
		DLTKLogging.debugOptions = new DLTKDebugOptions(debugOptions);
	}

	private static DLTKDebugOptions copy(DLTKDebugOptions source) {
		return new DLTKDebugOptions(source);
	}

	public static boolean isEnabled(String option) {
		final DLTKDebugOptions debugOptions = getDebugOptions();
		return debugOptions.contains(option);
	}

	public static void setEnabled(String option, boolean value) {
		final DLTKDebugOptions debugOptions = copy(getDebugOptions());
		if (value) {
			debugOptions.add(option);
		} else {
			debugOptions.remove(option);
		}
		setDebugOptions(debugOptions);
	}

	/**
	 * @param options
	 * @return
	 */
	public static Map<String, Boolean> getState(Collection<String> options) {
		final DLTKDebugOptions debugOptions = getDebugOptions();
		final Map<String, Boolean> result = new HashMap<>();
		for (String option : options) {
			boolean value = debugOptions.contains(option);
			result.put(option, Boolean.valueOf(value));
		}
		return result;
	}

	public static void setState(Map<String, Boolean> state) {
		final DLTKDebugOptions debugOptions = copy(getDebugOptions());
		for (Map.Entry<String, Boolean> entry : state.entrySet()) {
			if (entry.getValue().booleanValue()) {
				debugOptions.add(entry.getKey());
			} else {
				debugOptions.remove(entry.getKey());
			}
		}
		final IEclipsePreferences node = InstanceScope.INSTANCE
				.getNode(DLTKCore.PLUGIN_ID);
		if (!debugOptions.isEmpty()) {
			node.put(DLTKCore.LOGGING_OPTIONS, TextUtils.join(debugOptions,
					DLTKCore.LOGGING_OPTION_SEPARATOR));
		} else {
			node.remove(DLTKCore.LOGGING_OPTIONS);
		}
		try {
			node.flush();
		} catch (BackingStoreException e) {
			DLTKCore.error("Error Saving Logging Options", e); //$NON-NLS-1$
		}
		setDebugOptions(debugOptions);
	}

}
