/*******************************************************************************
 * Copyright (c) 2011 Mia-Software.
 * 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:
 *   Gregoire Dupe (Mia-Software) - Bug 367700 - [Unit Test Failure][0.2/3.8] org.eclipse.modisco.facet.widgets.table.tests.internal.v0_2.swtbot.NatTableUITests.testOpenLoadCustomizationDialog
 *   Gregoire Dupe (Mia-Software) - Bug 368006 - [Unit Test Failure][0.2/3.8] org.eclipse.modisco.facet.widgets.table.tests.internal.v0_2.swtbot.TableEditabilityTest.testSingleLineStringEditability
 *   Gregoire Dupe (Mia-Software) - Bug 368030 - [Unit Test Failure] org.eclipse.modisco.facet.widgets.table.tests.internal.v0_1.swtbot.NatTableUITests.testAddQueryColumn
 *******************************************************************************/
package org.eclipse.modisco.facet.util.tests.swtbot.internal.exported;

import java.io.File;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.modisco.facet.util.core.Logger;
import org.eclipse.modisco.facet.util.tests.swtbot.internal.Activator;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;

public final class ScreenShotUtils {

	private static final String SCREENSHOTS_DIR = "screenshots"; //$NON-NLS-1$
	private static final String SCREENSHOTS_FORMAT = ".png"; //$NON-NLS-1$

	private ScreenShotUtils() {
		// Must not be used.
	}

	public static void capture() {
		final String fileName = getPrefix() + getMethodName(2)
				+ ScreenShotUtils.SCREENSHOTS_FORMAT;
		final File pictureFile = new File(getLocation(), fileName);
		new SWTWorkbenchBot().captureScreenshot(pictureFile.toString());
	}

	public static void capture(final String imageName) {
		final String fileName = getPrefix() + getMethodName(2)
				+ cleanName(imageName) + ScreenShotUtils.SCREENSHOTS_FORMAT;
		final File pictureFile = new File(getLocation(), fileName);
		new SWTWorkbenchBot().captureScreenshot(pictureFile.toString());
	}
	
	public static void capture(final String imageName, final int offset) {
		final String fileName = getPrefix() + getMethodName(2 + offset)
				+ cleanName(imageName) + ScreenShotUtils.SCREENSHOTS_FORMAT;
		final File pictureFile = new File(getLocation(), fileName);
		new SWTWorkbenchBot().captureScreenshot(pictureFile.toString());
	}

	private static String getPrefix() {
		try {
			Thread.sleep(1);
		} catch (final InterruptedException e) {
			Logger.logWarning(e, Activator.getDefault());
		}
		return Long.toString(System.currentTimeMillis()) + '_';
	}

	private static String cleanName(final String imageName) {
		return imageName.replaceAll("[\\/\\\\\\?\\%\\*\\:\\|\\\"\\<\\>\\.]", //$NON-NLS-1$
				"_"); //$NON-NLS-1$
	}

	private static String getMethodName(final int offset) {
		final StackTraceElement[] stackTrace = Thread.currentThread()
				.getStackTrace();
		final StackTraceElement caller = stackTrace[1 + offset];
		return caller.getClassName() + '.' + caller.getMethodName() + '_';
	}

	private static File getLocation() {
		final File workspaceDir = ResourcesPlugin.getWorkspace().getRoot()
				.getLocation().toFile();
		return new File(workspaceDir, ScreenShotUtils.SCREENSHOTS_DIR);
	}

}
