package org.eclipse.egf.emf.wrapper.ui;

import java.io.IOException;
import java.util.Collections;
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.wrapper.CreateFcoreUtil;
import org.eclipse.egf.emf.wrapper.l10n.EMFWrapperMessages;
import org.eclipse.egf.model.fcore.presentation.FcoreModelWizard;
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 CreateFcoreFileWizard extends FcoreModelWizard {

  private IFile _genModel;

  public CreateFcoreFileWizard(IFile genModel) {
    _genModel = genModel;
  }

  @Override
  public void addPage(IWizardPage page) {
    if (page == newFileCreationPage)
      super.addPage(page);
  }

  @Override
  public void addPages() {
    super.addPages();
    newFileCreationPage.setFileName(getFileName());
  }

  @Override
  public boolean performFinish() {

    // Nothing to do
    if (_genModel == null) {
      return true;
    }

    final Throwable[] throwable = new Throwable[1];
    final IFile fcore = getFcore();

    // Convert and Process current Project
    WorkspaceModifyOperation convertOperation = new ConvertProjectOperation(_genModel.getProject(), false, false) {
      @Override
      public List<String> addDependencies() {
        return Collections.emptyList();
      }

      @Override
      public List<String> addSourceFolders() {
        return Collections.emptyList();
      }
    };
    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, EMFWrapperMessages.CreateFcoreFileWizard_Create_EMF_Wrapper, 1000);
            try {
              new CreateFcoreUtil().createFcoreFile(_genModel, fcore);
            } catch (IOException 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(_genModel);
        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 _genModel.getFullPath().removeFileExtension().addFileExtension(FILE_EXTENSIONS.get(0)).lastSegment();
  }

  private IFile getFcore() {
    return _genModel.getProject().getFile(newFileCreationPage.getContainerFullPath().removeFirstSegments(1).append(newFileCreationPage.getFileName()));
  }
}
