/*
 * Copyright (c) 2012, 2013, 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
 *    Christian W. Damus (CEA LIST) - bug 418454
 */
package org.eclipse.emf.cdo.ui.internal.admin;

import org.eclipse.emf.cdo.admin.CDOAdminClient;
import org.eclipse.emf.cdo.admin.CDOAdminClientManager;
import org.eclipse.emf.cdo.admin.CDOAdminClientRepository;
import org.eclipse.emf.cdo.common.admin.CDOAdminRepository;
import org.eclipse.emf.cdo.common.model.CDOPackageRegistryPopulator;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
import org.eclipse.emf.cdo.ui.internal.admin.actions.AdminAction;
import org.eclipse.emf.cdo.ui.internal.admin.actions.CreateRepositoryAction;
import org.eclipse.emf.cdo.ui.internal.admin.actions.DeleteRepositoryAction;
import org.eclipse.emf.cdo.ui.internal.admin.bundle.OM;
import org.eclipse.emf.cdo.ui.internal.admin.messages.Messages;
import org.eclipse.emf.cdo.ui.shared.SharedIcons;

import org.eclipse.emf.internal.cdo.session.CDOSessionFactory;

import org.eclipse.net4j.ui.Net4jItemProvider.RemoveAction;
import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.security.CredentialsProviderFactory;
import org.eclipse.net4j.util.security.IPasswordCredentialsProvider;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.net4j.util.ui.views.ContainerItemProvider;
import org.eclipse.net4j.util.ui.views.ContainerView;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;

import java.text.MessageFormat;

/**
 * @author Eike Stepper
 */
public class CDOAdminView extends ContainerView
{
  public final static String ID = "org.eclipse.emf.cdo.ui.admin.CDOAdminView"; //$NON-NLS-1$

  private final CDOAdminClientManager adminManager = OM.getAdminManager();

  private Image connectionImage = org.eclipse.net4j.ui.shared.SharedIcons
      .getImage(org.eclipse.net4j.ui.shared.SharedIcons.OBJ_CONNECTOR);

  private Image repositoryImage = SharedIcons.getImage(SharedIcons.OBJ_REPO);

  private IAction addConnectionAction;

  private static int lastSessionNumber;

  public CDOAdminView()
  {
  }

  @Override
  protected IContainer<?> getContainer()
  {
    return adminManager;
  }

  @Override
  protected ContainerItemProvider<IContainer<Object>> createContainerItemProvider()
  {
    return new ContainerItemProvider<IContainer<Object>>()
    {
      @Override
      public String getText(Object obj)
      {
        if (obj instanceof CDOAdminClient)
        {
          CDOAdminClient connection = (CDOAdminClient)obj;
          return connection.getURL();
        }

        if (obj instanceof CDOAdminRepository)
        {
          CDOAdminRepository repository = (CDOAdminRepository)obj;
          return MessageFormat.format(Messages.CDOAdminView_0, repository.getName(), repository.getType(),
              repository.getState());
        }

        return super.getText(obj);
      }

      @Override
      public Image getImage(Object obj)
      {
        if (obj instanceof CDOAdminClient)
        {
          return connectionImage;
        }

        if (obj instanceof CDOAdminRepository)
        {
          return repositoryImage;
        }

        return super.getImage(obj);
      }

      @Override
      public Font getFont(Object obj)
      {
        if (isDisabled(obj))
        {
          return getItalicFont();
        }

        return super.getFont(obj);
      }

      @Override
      public Color getForeground(Object obj)
      {
        if (isDisabled(obj))
        {
          return getDisplay().getSystemColor(SWT.COLOR_GRAY);
        }

        return super.getForeground(obj);
      }

      private boolean isDisabled(Object obj)
      {
        if (obj instanceof CDOAdminClient)
        {
          CDOAdminClient admin = (CDOAdminClient)obj;
          return !admin.isConnected();
        }

        return false;
      }
    };
  }

  @Override
  protected void fillContextMenu(IMenuManager manager, ITreeSelection selection)
  {
    super.fillContextMenu(manager, selection);

    if (selection.size() == 1)
    {
      Object obj = selection.getFirstElement();
      if (obj instanceof CDOAdminClient)
      {
        CDOAdminClient admin = (CDOAdminClient)obj;
        manager.add(new CreateRepositoryAction(admin));
        manager.add(new RemoveConnectionAction(adminManager, admin));
      }
      else if (obj instanceof CDOAdminClientRepository)
      {
        CDOAdminClientRepository repository = (CDOAdminClientRepository)obj;
        manager.add(new OpenSessionAction(repository));
        manager.add(new DeleteRepositoryAction(repository));
      }
    }
  }

  @Override
  protected void fillLocalToolBar(IToolBarManager manager)
  {
    if (addConnectionAction == null)
    {
      addConnectionAction = new Action()
      {
        @Override
        public void run()
        {
          String lastURL = OM.getLastURL();
          InputDialog dialog = new InputDialog(getShell(), getText(), Messages.CDOAdminView_1, lastURL, null);
          if (dialog.open() == InputDialog.OK)
          {
            String url = dialog.getValue();
            OM.setLastURL(url);
            adminManager.addConnection(url);
          }
        }
      };

      addConnectionAction.setText(Messages.CDOAdminView_2);
      addConnectionAction.setToolTipText(Messages.CDOAdminView_3);
      addConnectionAction.setImageDescriptor(
          org.eclipse.net4j.ui.shared.SharedIcons.getDescriptor(org.eclipse.net4j.ui.shared.SharedIcons.ETOOL_ADD));
    }

    manager.add(addConnectionAction);
    super.fillLocalToolBar(manager);
  }

  protected IPasswordCredentialsProvider getCredentialsProvider()
  {
    IManagedContainer container = adminManager.getContainer();
    String productGroup = CredentialsProviderFactory.PRODUCT_GROUP;
    String factoryType = "interactive"; //$NON-NLS-1$
    IPasswordCredentialsProvider credentialsProvider = (IPasswordCredentialsProvider)container.getElement(productGroup,
        factoryType, null);

    if (credentialsProvider == null)
    {
      credentialsProvider = UIUtil.createInteractiveCredentialsProvider();
    }

    return credentialsProvider;
  }

  public static int getNextSessionNumber()
  {
    return ++lastSessionNumber;
  }

  /**
   * @author Eike Stepper
   */
  public static class RemoveConnectionAction extends RemoveAction
  {
    private CDOAdminClientManager adminManager;

    public RemoveConnectionAction(CDOAdminClientManager adminManager, CDOAdminClient admin)
    {
      super(admin);
      this.adminManager = adminManager;
    }

    public CDOAdminClientManager getAdminManager()
    {
      return adminManager;
    }

    @Override
    public CDOAdminClient getObject()
    {
      return (CDOAdminClient)super.getObject();
    }

    @Override
    protected void doRun(IProgressMonitor progressMonitor) throws Exception
    {
      adminManager.removeConnection(getObject());
    }
  }

  /**
   * @author Eike Stepper
   */
  public class OpenSessionAction extends AdminAction<CDOAdminClientRepository>
      implements CDOAdminClientRepository.SessionConfigurator
  {
    public OpenSessionAction(CDOAdminClientRepository repository)
    {
      super(Messages.CDOAdminView_4, Messages.CDOAdminView_5, SharedIcons.getDescriptor(SharedIcons.ETOOL_OPEN_SESSION),
          repository);
    }

    public CDOAdminClientRepository getRepository()
    {
      return target;
    }

    @Override
    protected void safeRun(IProgressMonitor progressMonitor) throws Exception
    {
      CDONet4jSession session = target.openSession(this);
      if (session != null)
      {
        CDOPackageRegistryPopulator.populate(session.getPackageRegistry());

        IManagedContainer container = adminManager.getContainer();
        String description = "session" + getNextSessionNumber(); //$NON-NLS-1$
        container.putElement(CDOSessionFactory.PRODUCT_GROUP, "admin", description, session); //$NON-NLS-1$
      }
    }

    public void prepare(CDONet4jSessionConfiguration configuration)
    {
      IPasswordCredentialsProvider credentialsProvider = getCredentialsProvider();
      configuration.setCredentialsProvider(credentialsProvider);
    }

    @Override
    protected String getErrorPattern()
    {
      return Messages.CDOAdminView_6;
    }
  }
}
