/*=============================================================================#
 # Copyright (c) 2008, 2020 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.r.console.ui.launching;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;

import org.eclipse.statet.jcommons.ts.core.ToolCommandHandler;

import org.eclipse.statet.nico.core.runtime.HistoryOperationsHandler;
import org.eclipse.statet.nico.core.runtime.IToolEventHandler;
import org.eclipse.statet.nico.core.runtime.SubmitType;
import org.eclipse.statet.nico.core.runtime.ToolProcess;
import org.eclipse.statet.nico.ui.util.ChooseFileHandler;
import org.eclipse.statet.nico.ui.util.EclipseIDEOperationsHandler;
import org.eclipse.statet.nico.ui.util.QuitHandler;
import org.eclipse.statet.nico.ui.util.ReportStatusHandler;
import org.eclipse.statet.nico.ui.util.RunBlockingHandler;
import org.eclipse.statet.r.console.core.AbstractRController;
import org.eclipse.statet.r.core.RUtil;
import org.eclipse.statet.r.ui.dataeditor.ShowElementCommandHandler;
import org.eclipse.statet.r.ui.graphics.RGraphicCommandHandler;
import org.eclipse.statet.r.ui.pkgmanager.RPkgUICommandHandler;
import org.eclipse.statet.r.ui.rhelp.RHelpUICommandHandler;


public class RConsoleLaunching {
	
	
	public static final String R_CONSOLE_CONFIGURATION_TYPE_ID = "org.eclipse.statet.r.launchConfigurations.RConsole"; //$NON-NLS-1$
	public static final String R_REMOTE_CONSOLE_CONFIGURATION_TYPE_ID = "org.eclipse.statet.r.launchConfigurations.RRemoteConsole"; //$NON-NLS-1$
	
	public static final String R_CONSOLE_PROCESS_TYPE = "R"+ToolProcess.PROCESS_TYPE_SUFFIX; //$NON-NLS-1$
	
	
	public static final String LOCAL_RTERM = "local.rterm"; //$NON-NLS-1$
	public static final String LOCAL_RJS = "local.rjs-rmi"; //$NON-NLS-1$
	public static final String REMOTE_RJS = "remote.rjs-rmi"; //$NON-NLS-1$
	public static final String REMOTE_RJS_RECONNECT = "remote.rjs-rmi-reconnect"; //$NON-NLS-1$
	public static final String REMOTE_RJS_SSH = "remote.rjs-rmi.ssh"; //$NON-NLS-1$
	
	
	static final String ATTR_ROOT= "org.eclipse.statet.r.debug/RConsole/"; //$NON-NLS-1$
	
	/**
	 * Attribute key for R console type
	 */
	public static final String ATTR_TYPE = ATTR_ROOT+"type"; //$NON-NLS-1$
	
	/**
	 * Attribute key for R startup arguments
	 */
	public static final String ATTR_OPTIONS = ATTR_ROOT+"arguments.options"; //$NON-NLS-1$
	
	/**
	 * Attribute key for address, if required by console type
	 */
	public static final String ATTR_ADDRESS = ATTR_ROOT+"address"; //$NON-NLS-1$
	
	/**
	 * Attribute key to pin console at startup
	 */
	public static final String ATTR_PIN_CONSOLE = ATTR_ROOT+"console.pin"; //$NON-NLS-1$
	
	/**
	 * Attribute key for port number of SSH
	 */
	public static final String ATTR_SSH_PORT = ATTR_ROOT+"ssh.port"; //$NON-NLS-1$
	
	/**
	 * Attribute key for SSH tunnel option
	 */
	public static final String ATTR_SSH_TUNNEL_ENABLED = ATTR_ROOT+"ssh.tunnel.enabled"; //$NON-NLS-1$
	
	/**
	 * Attribute key for command to startup R
	 */
	public static final String ATTR_COMMAND = ATTR_ROOT+"command"; //$NON-NLS-1$
	
	/**
	 * Attribute key for login (e.g. SSH)
	 */
	public static final String ATTR_LOGIN_NAME = ATTR_ROOT+"login.name";
	
	/**
	 * Attribute key for init snippet (submitted after startup)
	 */
	public static final String ATTR_INIT_SCRIPT_SNIPPET = ATTR_ROOT+"init.script.snippet"; //$NON-NLS-1$
	
	/**
	 * Attribute to enable object db
	 */
	public static final String ATTR_OBJECTDB_ENABLED = ATTR_ROOT+"objectdb.enabled"; //$NON-NLS-1$
	
	public static final String ATTR_OBJECTDB_AUTOREFRESH_ENABLED = ATTR_ROOT+"objectdb.autorefresh.enabled"; //$NON-NLS-1$
	
	public static final String ATTR_OBJECTDB_LISTS_MAX_LENGTH = ATTR_ROOT+"objectdb.lists.max_length"; //$NON-NLS-1$
	public static final String ATTR_OBJECTDB_ENVS_MAX_LENGTH = ATTR_ROOT+"objectdb.envs.max_length"; //$NON-NLS-1$
	
	public static void registerDefaultHandlerTo(final AbstractRController controller) {
		controller.addCommandHandler(IToolEventHandler.SCHEDULE_QUIT_EVENT_ID, new QuitHandler());
		controller.addCommandHandler(IToolEventHandler.RUN_BLOCKING_EVENT_ID, new RunBlockingHandler());
		controller.addCommandHandler(IToolEventHandler.REPORT_STATUS_EVENT_ID, new ReportStatusHandler());
		{	final ToolCommandHandler handler = new HistoryOperationsHandler();
			controller.addCommandHandler(HistoryOperationsHandler.LOAD_HISTORY_ID, handler);
			controller.addCommandHandler(HistoryOperationsHandler.SAVE_HISTORY_ID, handler);
			controller.addCommandHandler(HistoryOperationsHandler.ADDTO_HISTORY_ID, handler);
			controller.addCommandHandler(ChooseFileHandler.CHOOSE_FILE_ID, new ChooseFileHandler());
		}
		{	final ToolCommandHandler handler = new EclipseIDEOperationsHandler();
			controller.addCommandHandler(EclipseIDEOperationsHandler.SHOW_FILE_ID, handler);
			controller.addCommandHandler(EclipseIDEOperationsHandler.SHOW_HISTORY_ID, handler);
		}
		{	final ToolCommandHandler handler = new ShowElementCommandHandler();
			controller.addCommandHandler(ShowElementCommandHandler.SHOW_ELEMENT_COMMAND_ID, handler);
		}
		{	final ToolCommandHandler handler = new RGraphicCommandHandler();
			controller.addCommandHandler(AbstractRController.INIT_RGRAPHIC_FACTORY_HANDLER_ID, handler);
		}
		{	final ToolCommandHandler handler = new RHelpUICommandHandler();
			controller.addCommandHandler(RHelpUICommandHandler.SHOW_HELP_COMMAND_ID, handler);
		}
		if (controller.getTool().getREnv() != null) {
			final ToolCommandHandler handler = new RPkgUICommandHandler();
			controller.addCommandHandler(RPkgUICommandHandler.OPEN_PACKAGE_MANAGER_COMMAND_ID, handler);
		}
	}
	
	public static void scheduleStartupSnippet(final AbstractRController controller, final ILaunchConfiguration configuration) throws CoreException {
		final String snippet = configuration.getAttribute(RConsoleLaunching.ATTR_INIT_SCRIPT_SNIPPET, (String) null);
		if (snippet != null && snippet.length() > 0) {
			final String[] lines = RUtil.LINE_SEPARATOR_PATTERN.split(snippet);
			for (final String line : lines) {
				controller.addStartupRunnable(controller.createCommandRunnable(line, SubmitType.TOOLS));
			}
		}
	}
}
