/*******************************************************************************
 * Copyright (c) 2015, 2016 Red Hat, Inc. 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:
 *    Red Hat Incorporated - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.debug.application.tests;

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.junit.After;
import org.junit.AfterClass;

public abstract class StandaloneTest {

	private static final String C_C_STAND_ALONE_DEBUGGER_TITLE = "Eclipse C/C++ Stand-alone Debugger";
	private static final String DEBUG_NEW_EXECUTABLE_TITLE = "Debug New Executable";
	protected static SWTBot bot;
	protected static String projectName;
	protected static SWTBotShell mainShell;
	protected static SWTBotView projectExplorer;
	private static final Logger fLogger = Logger.getRootLogger();

	public static void init(String projectName) throws Exception {
		SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
		SWTBotPreferences.TIMEOUT = 20000;

		fLogger.removeAllAppenders();
		fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));

		bot = new SWTBot();
		Utilities.getDefault().buildProject(projectName);
		final IPath executablePath = Utilities.getDefault().getProjectPath(projectName).append("a.out"); //$NON-NLS-1$
		bot.waitUntil(new WaitForFileCondition(executablePath));

		bot.waitUntil(Conditions.shellIsActive(DEBUG_NEW_EXECUTABLE_TITLE));
		SWTBotShell executableShell = bot.shell(DEBUG_NEW_EXECUTABLE_TITLE);
		executableShell.setFocus();

		executableShell.bot().textWithLabel("Binary: ").typeText(executablePath.toOSString());
		executableShell.bot().button("OK").click();

		bot.waitUntil(Conditions.shellIsActive(C_C_STAND_ALONE_DEBUGGER_TITLE));
		mainShell = bot.shell(C_C_STAND_ALONE_DEBUGGER_TITLE);
	}

	@After
	public void cleanUp() {
		//		SWTBotShell[] shells = bot.shells();
		//		for (final SWTBotShell shell : shells) {
		//			if (!shell.equals(mainShell)) {
		//				String shellTitle = shell.getText();
		//				if (shellTitle.length() > 0
		//						&& !shellTitle.startsWith("Quick Access")) {
		//					UIThreadRunnable.syncExec(new VoidResult() {
		//						@Override
		//						public void run() {
		//							if (shell.widget.getParent() != null
		//									&& !shell.isOpen()) {
		//								shell.close();
		//							}
		//						}
		//					});
		//				}
		//			}
		//		}
		//		mainShell.activate();
	}

	/**
	 * Test class tear down method.
	 */
	@AfterClass
	public static void tearDown() {
		fLogger.removeAllAppenders();
	}

	private static final class WaitForFileCondition extends DefaultCondition {
		private final IPath executablePath;

		private WaitForFileCondition(IPath executablePath) {
			this.executablePath = executablePath;
		}

		@Override
		public boolean test() throws Exception {
			return executablePath.toFile().exists();
		}

		@Override
		public String getFailureMessage() {
			return "Could not find executable after build.";
		}
	}
}
