package org.eclipse.dltk.ruby.fastdebugger;

import java.io.IOException;
import java.text.MessageFormat;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.dltk.core.PreferencesLookupDelegate;
import org.eclipse.dltk.launching.DebuggingEngineRunner;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.InterpreterConfig;
import org.eclipse.dltk.launching.debug.DbgpInterpreterConfig;
import org.eclipse.dltk.ruby.fastdebugger.preferences.FastDebuggerPreferenceConstants;
import org.eclipse.dltk.ruby.internal.launching.RubyGenericInstallType;

public class FastDebuggerRunner extends DebuggingEngineRunner {
	public static final String ENGINE_ID = "org.eclipse.dltk.ruby.fastdebugger";

	private static final String RUBY_HOST_VAR = "DBGP_RUBY_HOST";
	private static final String RUBY_PORT_VAR = "DBGP_RUBY_PORT";
	private static final String RUBY_KEY_VAR = "DBGP_RUBY_KEY";
	private static final String RUBY_SCRIPT_VAR = "DBGP_RUBY_SCRIPT";
	private static final String RUBY_LOG_VAR = "DBGP_RUBY_LOG";

	private static final String DEBUGGER_SCRIPT = "FastRunner.rb";

	protected IPath getLogFilename(PreferencesLookupDelegate delegate,
			String sessionId) {
		String pluginId = FastDebuggerPlugin.PLUGIN_ID;

		String logFilePath = delegate.getString(pluginId,
				FastDebuggerPreferenceConstants.LOG_FILE_PATH);
		String logFileName = delegate.getString(pluginId,
				FastDebuggerPreferenceConstants.LOG_FILE_NAME);

		String fileName = MessageFormat.format(logFileName,
				new Object[] { sessionId });

		return Path.fromOSString(logFilePath).append(fileName);
	}

	protected boolean isLoggingEnabled(PreferencesLookupDelegate delegate) {
		return delegate.getBoolean(FastDebuggerPlugin.PLUGIN_ID,
				FastDebuggerPreferenceConstants.ENABLE_LOGGING);
	}

	protected IPath deploy() throws CoreException {
		try {
			return FastDebuggerPlugin.getDefault().deployDebuggerSource();
		} catch (IOException e) {
			// TODO: add code for handler
			throw new CoreException(new Status(IStatus.ERROR,
					FastDebuggerPlugin.PLUGIN_ID,
					"Can't deploy debugger source", e));
		}
	}

	public FastDebuggerRunner(IInterpreterInstall install) {
		super(install);
	}

	protected InterpreterConfig addEngineConfig(InterpreterConfig config,
			PreferencesLookupDelegate delegate) throws CoreException {
		if (!(getInstall().getInterpreterInstallType() instanceof RubyGenericInstallType)) {
			throw new DebugException(
					new Status(IStatus.ERROR, FastDebuggerPlugin.PLUGIN_ID,
							"Fast debugger can be runned only with Generic Ruby interpreter"));
		}
		// Get debugger source location
		final IPath sourceLocation = deploy();

		final IPath scriptFile = sourceLocation.append(DEBUGGER_SCRIPT);

		// Creating new config
		InterpreterConfig newConfig = (InterpreterConfig) config.clone();
		newConfig.addInterpreterArg("-r" + scriptFile.toPortableString());
		newConfig.addInterpreterArg("-I" + sourceLocation.toPortableString());

		// Environment
		final DbgpInterpreterConfig dbgpConfig = new DbgpInterpreterConfig(
				config);

		newConfig.addEnvVar(RUBY_HOST_VAR, dbgpConfig.getHost());
		newConfig.addEnvVar(RUBY_PORT_VAR, Integer.toString(dbgpConfig
				.getPort()));

		String sessionId = dbgpConfig.getSessionId();
		newConfig.addEnvVar(RUBY_KEY_VAR, sessionId);
		newConfig.addEnvVar(RUBY_SCRIPT_VAR, config.getScriptFilePath()
				.toPortableString());

		if (isLoggingEnabled(delegate)) {
			newConfig.addEnvVar(RUBY_LOG_VAR, getLogFilename(delegate,
					sessionId).toPortableString());
		}

		return newConfig;
	}

	protected String getDebuggingEngineId() {
		return ENGINE_ID;
	}
}
