/*******************************************************************************
 * Copyright (c) 2005, 2017 IBM Corporation 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
 *
 *******************************************************************************/
package org.eclipse.dltk.console.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchListener;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.dltk.console.IScriptInterpreter;
import org.eclipse.dltk.console.ScriptConsoleServer;
import org.eclipse.dltk.console.ScriptInterpreterManager;
import org.eclipse.dltk.console.ui.internal.ConsoleViewManager;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.launching.ScriptLaunchConfigurationConstants;
import org.eclipse.dltk.launching.process.IScriptProcess;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.IConsoleView;

public class ScriptConsoleManager implements ILaunchListener {
	private static ScriptConsoleManager instance;

	public static synchronized ScriptConsoleManager getInstance() {
		if (instance == null) {
			instance = new ScriptConsoleManager();
		}

		return instance;
	}

	private IConsoleManager getConsoleManager() {
		return ConsolePlugin.getDefault().getConsoleManager();
	}

	/**
	 * @since 2.0
	 */
	public IScriptConsole[] getScriptConsoles(String consoleType) {
		List<IScriptConsole> consoles = new ArrayList<>();
		for (IConsole console : getConsoleManager().getConsoles()) {
			if (console instanceof IScriptConsole && console.getType().equals(consoleType)) {
				consoles.add((ScriptConsole) console);
			}
		}
		return consoles.toArray(new IScriptConsole[consoles.size()]);
	}

	private String[] consoleViewIds = null;

	private synchronized String[] getConsoleViewIds() {
		if (consoleViewIds == null) {
			final List<String> viewIds = new ArrayList<>();
			for (ConsoleViewManager.Descriptor descriptor : new ConsoleViewManager(
					"org.eclipse.dltk.console.ui.consoleView") //$NON-NLS-1$
							.getDescriptors()) {
				viewIds.add(descriptor.getViewId());
			}
			consoleViewIds = viewIds.toArray(new String[viewIds.size()]);
		}
		return consoleViewIds;
	}

	/**
	 * @since 2.0
	 */
	public IScriptConsole getActiveScriptConsole(String consoleType) {
		final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
		if (window != null) {
			final IWorkbenchPage page = window.getActivePage();
			if (page != null) {
				for (String consoleViewId : getConsoleViewIds()) {
					IViewPart part = page.findView(consoleViewId);
					if (part != null && part instanceof IConsoleView) {
						IConsoleView view = (IConsoleView) part;
						IConsole console = view.getConsole();
						if (console instanceof IScriptConsole && console.getType().equals(consoleType)) {
							return (IScriptConsole) console;
						}
					}
				}
			}
		}

		return null;
	}

	/**
	 * @since 2.0
	 */
	public void close(IScriptConsole console) {
		console.terminate();
		remove(console);
	}

	public void closeAll() {
		IConsole[] consoles = getConsoleManager().getConsoles();
		for (int i = 0; i < consoles.length; ++i) {
			IConsole console = consoles[i];
			if (console instanceof IScriptConsole) {
				close((IScriptConsole) console);
			}
		}
	}

	/**
	 * @since 2.0
	 */
	public void showConsole(IScriptConsole console) {
		getConsoleManager().showConsoleView(console);
	}

	/**
	 * @since 2.0
	 */
	public void add(IScriptConsole console) {
		getConsoleManager().addConsoles(new IConsole[] { console });
	}

	/**
	 * @since 2.0
	 */
	public void remove(IScriptConsole console) {
		getConsoleManager().removeConsoles(new IConsole[] { console });
	}

	protected IScriptConsoleFactory findScriptConsoleFactory(String natureId) throws CoreException {
		IExtensionRegistry reg = Platform.getExtensionRegistry();
		IExtensionPoint ep = reg.getExtensionPoint(ScriptConsoleUIConstants.SCRIPT_CONSOLE_EP);
		IExtension[] extensions = ep.getExtensions();

		for (int i = 0; i < extensions.length; i++) {
			IExtension ext = extensions[i];
			IConfigurationElement[] ce = ext.getConfigurationElements();
			for (int j = 0; j < ce.length; j++) {
				if (natureId.equals(ce[j].getAttribute(ScriptConsoleUIConstants.SCRIPT_CONSOLE_NATURE_ID))) {
					Object obj = ce[j].createExecutableExtension(ScriptConsoleUIConstants.SCRIPT_CONSOLE_CLASS);
					if (obj instanceof IScriptConsoleFactory) {
						return (IScriptConsoleFactory) obj;
					} else {
						return null;
					}
				}
			}
		}

		return null;
	}

	// ILaunchListener
	@Override
	public void launchAdded(final ILaunch launch) {
		launchChanged(launch);
	}

	@Override
	public void launchChanged(final ILaunch launch) {
		if (!ILaunchManager.RUN_MODE.equals(launch.getLaunchMode())) {
			return;
		}
		try {
			final ILaunchConfiguration configuration = launch.getLaunchConfiguration();
			if (configuration == null) {
				return;
			}
			boolean useDltk = configuration
					.getAttribute(ScriptLaunchConfigurationConstants.ATTR_USE_INTERACTIVE_CONSOLE, false);
			if (!useDltk) {
				return;
			}
			final ScriptConsole console = getConsole(launch);
			if (console != null) {
				IProcess[] processes = launch.getProcesses();
				for (int i = 0; i < processes.length; ++i) {
					final IProcess process = processes[i];
					if (process instanceof IScriptProcess) {
						console.connect((IScriptProcess) process);
					}
				}
				return;
			}
			final String natureId = configuration.getAttribute(ScriptLaunchConfigurationConstants.ATTR_SCRIPT_NATURE,
					(String) null);
			if (natureId == null) {
				return;
			}
			final String consoleId = configuration.getAttribute(ScriptLaunchConfigurationConstants.ATTR_DLTK_CONSOLE_ID,
					(String) null);
			final IScriptConsoleFactory factory = findScriptConsoleFactory(natureId);
			if (factory == null) {
				return;
			}
			SafeRunner.run(new ISafeRunnable() {
				@Override
				public void handleException(Throwable exception) {
				}

				@Override
				public void run() throws Exception {
					IScriptInterpreter interpreter = ScriptInterpreterManager.getInstance().createInterpreter(natureId);
					ScriptConsoleServer.getInstance().register(consoleId, interpreter);
					factory.openConsole(interpreter, configuration.getName(), launch);
				}
			});
		} catch (CoreException e) {
			if (DLTKCore.DEBUG) {
				e.printStackTrace();
			}
		}
	}

	private ScriptConsole getConsole(ILaunch launch) {
		final IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
		final IConsole[] consoles = manager.getConsoles();
		for (int i = 0; i < consoles.length; i++) {
			final IConsole console = consoles[i];
			if (console instanceof ScriptConsole) {
				final ScriptConsole sc = (ScriptConsole) console;
				final ILaunch consoleLaunch = sc.getLaunch();
				if (consoleLaunch != null && consoleLaunch.equals(launch)) {
					return sc;
				}
			}
		}
		return null;
	}

	@Override
	public void launchRemoved(ILaunch launch) {
		final IConsole console = getConsole(launch);
		if (console != null) {
			IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
			manager.removeConsoles(new IConsole[] { console });
		}
	}
}
