/*
 * Copyright (c) 2015 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.explorer.ui.checkouts.wizards;

import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.eresource.CDOResourceFolder;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;
import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutContentProvider;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.util.ui.UIUtil;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;

/**
 * @author Eike Stepper
 */
public abstract class NewWizard extends Wizard implements INewWizard
{
  private final String resourceType;

  private final String title;

  private IStructuredSelection selection;

  private CDOCheckoutContentProvider contentProvider;

  private NewWizardPage page;

  protected NewWizard(String resourceType, String title)
  {
    this.resourceType = resourceType;
    this.title = title;
  }

  public void init(IWorkbench workbench, IStructuredSelection selection)
  {
    this.selection = selection;
  }

  public void setContentProvider(CDOCheckoutContentProvider contentProvider)
  {
    this.contentProvider = contentProvider;
  }

  public final String getResourceType()
  {
    return resourceType;
  }

  public final String getTitle()
  {
    return title;
  }

  @Override
  public void addPages()
  {
    page = new NewWizardPage(resourceType, title, selection);
    addPage(page);
  }

  @Override
  public boolean performFinish()
  {
    final Object parent = page.getParent();
    final String name = page.getName();

    new Job(title)
    {
      @Override
      protected IStatus run(IProgressMonitor monitor)
      {
        CDOResourceNode newResourceNode = createNewResourceNode();
        newResourceNode.setName(name);

        CDOCheckout checkout;
        CDOResourceNode parentResourceNode;

        if (parent instanceof CDOCheckout)
        {
          checkout = (CDOCheckout)parent;
          parentResourceNode = (CDOResourceNode)checkout.getRootObject();
        }
        else
        {
          parentResourceNode = (CDOResourceNode)parent;
          checkout = CDOExplorerUtil.getCheckout(parentResourceNode);
        }

        CDOTransaction transaction = checkout.openTransaction();

        CDOCommitInfo commitInfo = null;
        CDOID newID = null;

        try
        {
          CDOResourceNode txParent = transaction.getObject(parentResourceNode);
          if (txParent instanceof CDOResourceFolder)
          {
            ((CDOResourceFolder)txParent).getNodes().add(newResourceNode);
          }
          else
          {
            transaction.getRootResource().getContents().add(newResourceNode);
          }

          commitInfo = transaction.commit();
          newID = newResourceNode.cdoID();
        }
        catch (Exception ex)
        {
          OM.LOG.error(ex);

          final IStatus status = new Status(IStatus.ERROR, OM.BUNDLE_ID, ex.getMessage(), ex);
          UIUtil.getDisplay().asyncExec(new Runnable()
          {
            public void run()
            {
              ErrorDialog.openError(getShell(), "Error",
                  "An error occured while creating the " + title.toLowerCase() + ".", status);
            }
          });

          return Status.OK_STATUS;
        }
        finally
        {
          transaction.close();
        }

        if (commitInfo != null && contentProvider != null)
        {
          CDOView view = checkout.getView();
          view.waitForUpdate(commitInfo.getTimeStamp());

          CDOObject newObject = view.getObject(newID);
          contentProvider.selectObjects(newObject);
        }

        return Status.OK_STATUS;
      }
    }.schedule();

    return true;
  }

  protected abstract CDOResourceNode createNewResourceNode();
}
