/*******************************************************************************
 * Copyright (c) 2014, 2017 TwelveTone LLC 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:
 * Steven Spungin <steven@spungin.tv> - initial API and implementation, Bug 436848
 *******************************************************************************/

package org.eclipse.e4.tools.emf.ui.internal.common.resourcelocator.dialogs;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.tools.emf.ui.internal.common.component.dialogs.BundleImageCache;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.widgets.Shell;

/**
 * A Wizard for resolving unreferenced resources
 *
 * @author Steven Spungin
 *
 */
public class NonReferencedResourceWizard extends DynamicWizard {

	private final NonReferencedActionPage nonReferencedActionPage;
	protected IProject project;
	IEclipseContext wizContext;

	BundleImageCache imageCache;

	public NonReferencedResourceWizard(Shell parentShell, IProject project, String bundle, IFile file,
			String installLocation, IEclipseContext context) {
		this.project = project;

		wizContext = context.createChild();
		wizContext.set(IProject.class, project);
		wizContext.set("srcPath", file.getFullPath().toOSString()); //$NON-NLS-1$
		wizContext.set(Runnable.class, null);
		wizContext.set("resolvedFile", null); //$NON-NLS-1$

		imageCache = new BundleImageCache(parentShell.getDisplay(), getClass().getClassLoader(), context);
		parentShell.addDisposeListener(e -> imageCache.dispose());
		wizContext.set(BundleImageCache.class, imageCache);

		nonReferencedActionPage = new NonReferencedActionPage(project, bundle, file, installLocation, wizContext);
	}

	@Override
	public boolean performFinish() {
		final Runnable action = wizContext.get(Runnable.class);
		if (action != null) {
			action.run();
		}
		return true;
	}

	public IFile getResult() {
		return (IFile) wizContext.get("resolvedFile"); //$NON-NLS-1$
	}

	@Override
	public IWizardPage getNextPage(IWizardPage page) {
		if (page instanceof NonReferencedActionPage) {
			clearDynamicPages();
			final NonReferencedAction action = wizContext.get(NonReferencedAction.class);
			if (action == null) {
				return null;
			}
			switch (action) {
			case COPY: {
				final PickProjectFolderPage pickProjectFolderPage = new PickProjectFolderPage(wizContext);
				addPage(pickProjectFolderPage);
				return pickProjectFolderPage;
			}
			case COPY_TO_OTHER:
				final PickProjectPage pickProjectPage = new PickProjectPage(wizContext);
				addPage(pickProjectPage);
				final PickProjectFolderPage pickProjectFolderPage = new PickProjectFolderPage(wizContext);
				addPage(pickProjectFolderPage);
				return pickProjectPage;
			case USE_ANYWAY:
				return null;
			case IMPORT:
				// TODO Page to set version
				return null;
			case REQUIRE:
				// TODO Page to set version
				return null;
			case CONVERT_AND_REQUIRE:
				// TODO Page for new bundle's information
				return null;
			default:
				return null;
			}
		}
		return super.getNextPage(page);
	}

	@Override
	public void addPages() {
		addPage(nonReferencedActionPage);
	}
}
