/*********************************************************************
* Copyright (c) 2012, 2019 SAP SE
*
* 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/
*
* Contributors:
*    SAP SE - initial API, implementation and documentation
*    mwenz - Bug 388211 - New plug-in with Graphiti editor wizard adds not needed dependency to org.eclipse.ui
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.bot.tests;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.pde.core.plugin.IPluginImport;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotPerspective;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class PluginWizardTests extends AbstractGFTests {

	private IProject newProject;
	private SWTBotPerspective previousPerspective;

	public PluginWizardTests() {
		super();
	}

	@Override
	@Before
	protected void setUp() throws Exception {
		super.setUp();
		previousPerspective = bot.activePerspective();
	}

	@Override
	@After
	protected void tearDown() throws Exception {
		page.closeAllEditors();
		if (newProject != null) {
			newProject.delete(true, true, new NullProgressMonitor());
		}
		super.tearDown();
		bot.perspectiveByLabel(previousPerspective.getLabel()).activate();

		Thread.sleep(5000);
	}

	@Test
	public void testPluginWizardRun() throws Exception {
		// // Check problems view and remember number of errors before test
		// int numberOfErrorsBeforeTest =
		// extractAllItemsFromProblemsView().length;

		// Start wizard
		bot.menu("File").menu("New").menu("Project...").click();
		SWTBotShell shell = bot.shell("New Project");
		shell.activate();
		bot.tree().expandNode("Plug-in Development").select("Plug-in Project");
		bot.button("Next >").click();

		// Provide name for new plugin project
		bot.textWithLabel("Project name:").setText("org.eclipse.graphiti.test1");
		bot.button("Next >").click();

		// Deselect activator generation, test for Bug 388211
		bot.checkBoxInGroup("Options", 0).deselect();
		bot.button("Next >").click();

		// Enable template table
		bot.checkBox("Create a plug-in using a templates").select();

		// Select Graphiti extension
		bot.table().select("Plug-in with a Graphiti Editor");
		bot.button("Next >").click();

		// Check fields are filled
		String diagramTypeId = bot.textWithLabelInGroup("ID", "Diagram Type").getText();
		assertEquals("org.eclipse.graphiti.test1.test1DiagramType", diagramTypeId);

		// Finish the wizard
		bot.button("Finish").click();

		// Confirm perspective switch
		shell = bot.shell("Open Associated Perspective?");
		shell.activate();
		bot.button("Open Perspective").click();

		Thread.sleep(2000);

		newProject = ResourcesPlugin.getWorkspace().getRoot().getProject("org.eclipse.graphiti.test1");
		int counter = 0;
		while (!newProject.exists() && counter < 20) {
			counter++;
			Thread.sleep(1000);
		}
		assertTrue(newProject.exists());

		// // Check problems view for any errors
		// SWTBotTreeItem[] allItems = extractAllItemsFromProblemsView();
		// counter = 0;
		// while ((allItems == null || allItems.length !=
		// numberOfErrorsBeforeTest) && counter < 60) {
		// counter++;
		// Thread.sleep(1000);
		// allItems = extractAllItemsFromProblemsView();
		// }
		// assertTrue("Items found in problems view: " + allItems.toString()
		// + ", expected were (number of errors before test: " +
		// numberOfErrorsBeforeTest,
		// allItems.length == numberOfErrorsBeforeTest);

		// Check that org.eclipse.ui is not part of the dependencies (no
		// activator is generated), test for Bug 388211
		IPluginModelBase newPluginModel = PluginRegistry.findModel(newProject);
		counter = 0;
		while ((newPluginModel == null || newPluginModel.getPluginBase() == null) && counter < 20) {
			newPluginModel = PluginRegistry.findModel(newProject);
			counter++;
			Thread.sleep(1000);
		}
		IPluginImport[] imports = newPluginModel.getPluginBase().getImports();
		for (IPluginImport pluginImport : imports) {
			if ("org.eclipse.ui".equals(pluginImport.getId())) {
				fail("'org.eclipse.ui' should not be part of the dependencies");
			}
		}
	}

	// private SWTBotTreeItem[] extractAllItemsFromProblemsView() {
	// SWTBotTreeItem[] allItems;
	// SWTBotView view = bot.viewById(IPageLayout.ID_PROBLEM_VIEW);
	// view.show();
	// SWTBotTree tree = view.bot().tree();
	// allItems = tree.getAllItems();
	// return allItems;
	// }
}
