/*******************************************************************************
 * Copyright (c) 2010 The Eclipse Foundation 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:
 *     The Eclipse Foundation - initial API and implementation
 *******************************************************************************/
package org.eclipse.epp.internal.mpc.core.service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.epp.internal.mpc.core.MarketplaceClientCore;
import org.eclipse.userstorage.IStorage;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.Version;

public abstract class StorageConfigurer {

	public static final String PROP_FACTORIES = StorageConfigurer.class.getName() + ".factories";
	private static final String[] DEFAULT_FACTORIES = { "org.eclipse.epp.internal.mpc.core.service.USS11ExtendedOAuthStorageConfigurer$Factory",
			"org.eclipse.epp.internal.mpc.core.service.USS11OAuthStorageConfigurer$Factory",
	"org.eclipse.epp.internal.mpc.core.service.USS10StorageConfigurer$Factory" };

	abstract static class Factory {
		abstract boolean isApplicable();

		abstract StorageConfigurer doCreate();

		public StorageConfigurer create() {
			if (isApplicable()) {
				return doCreate();
			}
			return null;
		}
	}

	static Version getUSSVersion() {
		Bundle bundle = FrameworkUtil.getBundle(IStorage.class);
		return bundle.getVersion();
	}

	private static StorageConfigurer instance;

	private static StorageConfigurer create() throws CoreException {
		String[] factories = getFactories();

		MultiStatus errors = new MultiStatus(MarketplaceClientCore.BUNDLE_ID, 0,
				"Failed to create user storage configurer", null);
		for (String factoryName : factories) {
			try {
				Class<? extends Factory> factoryClass = Class.forName(factoryName).asSubclass(Factory.class);
				Factory factory = factoryClass.newInstance();
				StorageConfigurer configurer = factory.create();
				if (configurer != null) {
					return configurer;
				}
			} catch (Exception e) {
				errors.add(new Status(IStatus.ERROR, MarketplaceClientCore.BUNDLE_ID, factoryName, e));
			}
		}
		try {
			return new USS10StorageConfigurer();
		} catch (Throwable t) {
			errors.add(new Status(IStatus.ERROR, MarketplaceClientCore.BUNDLE_ID, "Fallback", t));
		}
		throw new CoreException(errors);
	}

	private static String[] getFactories() {
		String[] factories = DEFAULT_FACTORIES;
		String factoriesValue = System.getProperty(PROP_FACTORIES);
		if (factoriesValue != null && !factoriesValue.isEmpty()) {
			String[] givenFactories = factoriesValue.split("\\s+"); //$NON-NLS-1$
			List<String> givenFactoriesList = new ArrayList<String>(Arrays.asList(givenFactories));
			Set<String> supportedFactories = new HashSet<String>(Arrays.asList(DEFAULT_FACTORIES));
			givenFactoriesList.retainAll(supportedFactories);
			factories = givenFactoriesList.toArray(new String[givenFactoriesList.size()]);
		}
		return factories;
	}

	public static synchronized StorageConfigurer get() throws CoreException {
		if (instance == null) {
			instance = create();
		}
		return instance;
	}

	public static synchronized StorageConfigurer reset() throws CoreException {
		StorageConfigurer oldInstance = instance;
		instance = null;
		StorageConfigurer newInstance = get();
		if (oldInstance != null && newInstance.getClass() == oldInstance.getClass()) {
			instance = oldInstance;
		}
		return instance;
	}

	public static synchronized void unset() {
		instance = null;
	}

	public abstract void configure(IStorage storage) throws CoreException;

	public abstract Object setInteractive(IStorage storage, boolean interactive) throws CoreException;

	abstract void restoreInteractive(IStorage storage, Object restoreValue) throws CoreException;

	public <T> T runWithLogin(IStorage storage, Callable<T> c) throws Exception {
		final Object restoreValue = setInteractive(storage, true);
		try {
			T result = c.call();
			return result;
		} finally {
			restoreInteractive(storage, restoreValue);
		}
	}
}
