/*******************************************************************************
 * Copyright (c) 2013 Remain BV, Industrial-TSI BV 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:
 * Wim Jongmam <wim.jongman@remainsoftware.com> - initial API and implementation
 * Steven Spungin <steven@spungin.tv> - Ongoing Maintenance
 ******************************************************************************/
package org.eclipse.e4.tools.emf.ui.internal.imp;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
import org.eclipse.e4.tools.services.IResourcePool;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.wizard.Wizard;

public class ModelImportWizard extends Wizard {

	private final Class<? extends MApplicationElement> applicationElement;

	private ModelImportPage1 page1;

	private final MApplication application;

	private final AbstractComponentEditor editor;

	private final String hint;

	public ModelImportWizard(Class<? extends MApplicationElement> applicationElement, AbstractComponentEditor editor,
		IResourcePool resourcePool) {
		this(applicationElement, editor, "", resourcePool); //$NON-NLS-1$
	}

	public ModelImportWizard(Class<? extends MApplicationElement> applicationElement, AbstractComponentEditor editor,
		String hint, IResourcePool resourcePool) {
		this.applicationElement = applicationElement;
		this.editor = editor;
		this.hint = hint;
		Object modelSelection = editor.getEditor().getModelProvider().getRoot().get(0);
		if (modelSelection instanceof MApplication) {
			application = (MApplication) modelSelection;
		} else {
			application = null;
		}
		setWindowTitle(Messages.ModelImportWizard_Model
			+ " " + applicationElement.getSimpleName() + " " + Messages.ModelImportWizard_ImportWizard); //$NON-NLS-1$ //$NON-NLS-2$
		setDefaultPageImageDescriptor(ImageDescriptor.createFromImage(resourcePool
			.getImageUnchecked(ResourceProvider.IMG_Wizban16_imp3x_wiz)));
		Assert.isNotNull(RegistryUtil.getStruct(applicationElement, getHint()),
			Messages.ModelImportWizard_UnknownElement + ": " + applicationElement.getClass().getName()); //$NON-NLS-1$
	}

	@Override
	public void addPages() {
		page1 = new ModelImportPage1();
		page1.setWizard(this);
		addPage(page1);
	}

	@Override
	public boolean performFinish() {

		return true;
	}

	/**
	 * @return the {@link MApplicationElement} passed in the constructor.
	 */
	public Class<? extends MApplicationElement> getApplicationElement() {
		return applicationElement;
	}

	/**
	 * @return the extension point name associated with the {@link MApplicationElement} that is passed in the
	 *         constructor of
	 *         this wizard.
	 * @see #MAPPING_EXTENSION
	 * @see #getApplicationElement()
	 */
	protected String getExtensionPointName() {
		return RegistryUtil.getStruct(applicationElement, getHint()).getExtensionPointName();
	}

	/**
	 * @return the extension point id associated with the {@link MApplicationElement} that is passed in the constructor
	 *         of
	 *         this wizard.
	 * @see #MAPPING_EXTENSION
	 * @see #getApplicationElement()
	 */
	protected String getExtensionPoint() {
		return RegistryUtil.getStruct(applicationElement, getHint()).getExtensionPoint();
	}

	/**
	 * @return the attribute name of the {@link IConfigurationElement} that
	 *         contains the description that you want to see in the wizard page.
	 * @see #MAPPING_NAME
	 */
	protected String getMappingName() {
		return RegistryUtil.getStruct(applicationElement, getHint()).getMappingName();
	}

	/**
	 * Returns the list of {@link MApplicationElement}s of the type passed in
	 * the constructor of the wizard.
	 *
	 *
	 *
	 * @return an array of {@link MApplicationElement}
	 */
	public MApplicationElement[] getElements(Class<? extends MApplicationElement> type) {
		return RegistryUtil.getModelElements(type, getHint(), application, page1.getConfigurationElements());
	}

	public AbstractComponentEditor getEditor() {
		return editor;
	}

	/**
	 * Returns if this is a live model.
	 *
	 * @return true or false
	 */
	public boolean isLiveModel() {
		return editor.getEditor().isLiveModel();
	}

	/**
	 * Returns the hint that explains the meaning of the caller.
	 *
	 * @return the hint as a String
	 */
	public String getHint() {
		return hint;
	}
}
