/*******************************************************************************
 * Copyright (c) 2005, 2016 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
 *
 *******************************************************************************/
package org.eclipse.dltk.internal.core;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.dltk.codeassist.ICompletionEngine;
import org.eclipse.dltk.codeassist.ISelectionEngine;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.PriorityClassDLTKExtensionManager;
import org.eclipse.dltk.core.search.matching.IMatchLocator;
import org.eclipse.dltk.core.search.matching.MatchLocator;
import org.eclipse.dltk.utils.PriorityNatureExtensionManager;

public class InternalDLTKLanguageManager {
	private final static String LANGUAGE_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".language"; //$NON-NLS-1$
	private final static String SOURCE_ELEMENT_PARSERS_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".sourceElementParsers"; //$NON-NLS-1$
	private final static String BINARY_ELEMENT_PARSERS_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".binaryElementParsers"; //$NON-NLS-1$
	private final static String SOURCE_PARSERS_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".sourceParsers"; //$NON-NLS-1$
	public final static String PROBLEM_FACTORY_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".problemFactory"; //$NON-NLS-1$
	public final static String COMPLETION_ENGINE_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".completionEngine"; //$NON-NLS-1$
	private final static String SELECTION_ENGINE_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".selectionEngine"; //$NON-NLS-1$
	private final static String SEARCH_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".search"; //$NON-NLS-1$
	private final static String CALLHIERARCHY_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".callHierarchy"; //$NON-NLS-1$
	private final static String FILE_HIERARCHY_RESOLVER_EXTPOINT = DLTKCore.PLUGIN_ID
			+ ".fileHierarchyResolvers";//$NON-NLS-1$

	private static PriorityClassDLTKExtensionManager languageToolkitsManager = new PriorityClassDLTKExtensionManager(
			LANGUAGE_EXTPOINT);

	// Inner managers
	private static PriorityClassDLTKExtensionManager sourceElementParsersManager = new NewInstanceClassBasedDLTKExtensionManager(
			SOURCE_ELEMENT_PARSERS_EXTPOINT);
	private static PriorityClassDLTKExtensionManager binaryElementParsersManager = new NewInstanceClassBasedDLTKExtensionManager(
			BINARY_ELEMENT_PARSERS_EXTPOINT);
	private static PriorityClassDLTKExtensionManager problemFactoryManager = new PriorityClassDLTKExtensionManager(
			PROBLEM_FACTORY_EXTPOINT) {
		@Override
		protected boolean isValidConfigurationElement(
				IConfigurationElement element) {
			return "problemFactory".equals(element.getName());
		}
	};

	private static PriorityNatureExtensionManager<ISelectionEngine> selectionEngineManager = new PriorityNatureExtensionManager<ISelectionEngine>(
			SELECTION_ENGINE_EXTPOINT, ISelectionEngine.class) {
		@Override
		protected void saveInstances(String natureId,
				ISelectionEngine[] resultArray) {
			// empty
		}
	};
	private static PriorityNatureExtensionManager<ICompletionEngine> completionEngineManager = new PriorityNatureExtensionManager<ICompletionEngine>(
			COMPLETION_ENGINE_EXTPOINT, ICompletionEngine.class) {
		@Override
		protected void saveInstances(String natureId,
				ICompletionEngine[] resultArray) {
			// empty
		}
	};
	private static PriorityClassDLTKExtensionManager sourceParsersManager = new NewInstanceClassBasedDLTKExtensionManager(
			SOURCE_PARSERS_EXTPOINT);

	private static PriorityClassDLTKExtensionManager searchManager = new PriorityClassDLTKExtensionManager(
			SEARCH_EXTPOINT) {
		@Override
		protected boolean isValidConfigurationElement(
				IConfigurationElement element) {
			return "searchFactory".equals(element.getName())
					|| "seachFactory".equals(element.getName());
			// XXX there was a typo in schema
		}
	};
	private static PriorityClassDLTKExtensionManager callHierarchyManager = new PriorityClassDLTKExtensionManager(
			CALLHIERARCHY_EXTPOINT);
	private static PriorityClassDLTKExtensionManager fileHierarchyResolversManager = new PriorityClassDLTKExtensionManager(
			FILE_HIERARCHY_RESOLVER_EXTPOINT);

	public static PriorityClassDLTKExtensionManager getSourceElementParsersManager() {
		return sourceElementParsersManager;
	}

	public static PriorityClassDLTKExtensionManager getBinaryElementParsersManager() {
		return binaryElementParsersManager;
	}

	public static PriorityClassDLTKExtensionManager getProblemFactoryManager() {
		return problemFactoryManager;
	}

	public static PriorityNatureExtensionManager<ISelectionEngine> getSelectionEngineManager() {
		return selectionEngineManager;
	}

	public static PriorityNatureExtensionManager<ICompletionEngine> getCompletionEngineManager() {
		return completionEngineManager;
	}

	public static PriorityClassDLTKExtensionManager getSourceParsersManager() {
		return sourceParsersManager;
	}

	public static PriorityClassDLTKExtensionManager getSearchManager() {
		return searchManager;
	}

	public static PriorityClassDLTKExtensionManager getCallHierarchyManager() {
		return callHierarchyManager;
	}

	public static PriorityClassDLTKExtensionManager getFileHierarchyResolversManager() {
		return fileHierarchyResolversManager;
	}

	public static PriorityClassDLTKExtensionManager getLanguageToolkitsManager() {
		return languageToolkitsManager;
	}

	private static final PriorityClassDLTKExtensionManager matchLocatorManager = new PriorityClassDLTKExtensionManager(
			SEARCH_EXTPOINT) {
		@Override
		protected boolean isValidConfigurationElement(
				IConfigurationElement element) {
			return "matchLocator".equals(element.getName());
		}

		@Override
		public Object getInitObject(ElementInfo ext) {
			try {
				if (ext != null)
					return createObject(ext.config);
			} catch (CoreException e) {
				if (DLTKCore.DEBUG)
					e.printStackTrace();
			}
			return null;
		}
	};

	/**
	 * @param natureID
	 * @return
	 */
	public static IMatchLocator createMatchLocator(String natureID) {
		final IMatchLocator locator = (IMatchLocator) matchLocatorManager
				.getObject(natureID);
		if (locator != null) {
			return locator;
		}
		return new MatchLocator();
	}

}
