package org.eclipse.egf.emf.pattern.codegen.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.egf.common.ui.helper.ThrowableHandler;
import org.eclipse.egf.core.pde.tools.ConvertProjectOperation;
import org.eclipse.egf.emf.pattern.codegen.CodegenFcoreUtil;
import org.eclipse.egf.emf.pattern.codegen.ui.Activator;
import org.eclipse.egf.emf.pattern.codegen.ui.Messages;
import org.eclipse.egf.model.fcore.presentation.FcoreModelWizard;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ISetSelectionTarget;

public class ReverseCodegenWizard extends FcoreModelWizard {

    public ReverseCodegenWizard() {
    }

    @Override
    public void addPage(IWizardPage page) {
        if (page == newFileCreationPage) {
            super.addPage(page);
            ((FcoreModelWizardNewFileCreationPage)page).setAllowExistingResources(true);
        }
    }

    @Override
    public void addPages() {
        super.addPages();
        newFileCreationPage.setFileName(getFileName());
    }

    @Override
    public boolean canFinish() {
        if (getFcore().exists()) {
            newFileCreationPage.setMessage(Messages.ReverseCodegenWizard_1, IMessageProvider.WARNING);
        }
        return super.canFinish();
    }
    
    @Override
    public boolean performFinish() {        
        final Throwable[] throwable = new Throwable[1];
        final IFile fcore = getFcore();

        // Convert and Process current Project
        WorkspaceModifyOperation convertOperation = new ConvertProjectOperation(getFcore().getProject(), true, true) {
            @Override
            public List<String> addDependencies() {
                List<String> dependencies = new ArrayList<String>(1);
                dependencies.add("org.eclipse.egf.model.ftask"); //$NON-NLS-1$
                dependencies.add("org.eclipse.egf.emf.pattern.base"); //$NON-NLS-1$
                return dependencies;
            }

            @Override
            public List<String> addSourceFolders() {
                List<String> sourceFolders = new ArrayList<String>(1);
                sourceFolders.add("generated"); //$NON-NLS-1$
                return sourceFolders;
            }
        };
        try {
            getContainer().run(false, false, convertOperation);
        } catch (Throwable t) {
            throwable[0] = t;
        }

        // Save resource
        if (throwable[0] == null) {
            WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
                @Override
                protected void execute(IProgressMonitor monitor) {
                    try {
                        SubMonitor.convert(monitor, Messages.ReverseCodegenWizard_0, 1000);
                        try {
                            new CodegenFcoreUtil().createFcoreFile(fcore, monitor);
                        } catch (Exception ioe) {
                            throwable[0] = ioe;
                        }
                    } finally {
                        monitor.done();
                    }
                }
            };
            try {
                getContainer().run(false, true, operation);
            } catch (Throwable t) {
                throwable[0] = t;
            }
        }

        // Select the new file resource in the current view.
        if (throwable[0] == null) {
            IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
            IWorkbenchPage page = workbenchWindow.getActivePage();
            final IWorkbenchPart activePart = page.getActivePart();
            if (activePart instanceof ISetSelectionTarget) {
                final ISelection targetSelection = new StructuredSelection(fcore);
                getShell().getDisplay().asyncExec(new Runnable() {
                    public void run() {
                        ((ISetSelectionTarget) activePart).selectReveal(targetSelection);
                    }
                });
            }
            // Open an editor on the new file.
            try {
                page.openEditor(new FileEditorInput(fcore), workbench.getEditorRegistry().getDefaultEditor(fcore.getFullPath().toString()).getId());
            } catch (Throwable t) {
                throwable[0] = t;
            }
        }

        // Display errors if any
        if (throwable[0] != null && throwable[0] instanceof InterruptedException == false) {
            ThrowableHandler.handleThrowable(Activator.getDefault().getPluginID(), throwable[0]);
            return false;
        }

        return true;
    }

    private String getFileName() {
        return "EMF_Pattern.fcore"; //$NON-NLS-1$
    }

    private IFile getFcore() {
        return newFileCreationPage.getModelFile();
    }
}
