/*
 * 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.actions;

import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.explorer.ui.bundle.OM;
import org.eclipse.emf.cdo.ui.shared.SharedIcons;
import org.eclipse.emf.cdo.ui.widgets.TimeSlider;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.util.AdapterUtil;
import org.eclipse.net4j.util.ui.widgets.ImageButton;
import org.eclipse.net4j.util.ui.widgets.StackComposite;

import org.eclipse.emf.ecore.EObject;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;

import java.util.Iterator;

/**
 * @author Eike Stepper
 */
public class CDOCheckoutDashboard extends Composite implements ISelectionListener
{
  private final ISelectionService selectionService;

  private final Label iconLabel;

  private final Label titleLabel;

  private final ImageButton closeButton;

  private final StackComposite stackComposite;

  private final InfoPage infoPage;

  private final ViewPage viewPage;

  private final TransactionPage transactionPage;

  private DashboardPage currentPage;

  private CDOView currentView;

  public CDOCheckoutDashboard(Composite parent, ISelectionService selectionService)
  {
    super(parent, SWT.NONE);
    this.selectionService = selectionService;

    GridLayout gridLayout = new GridLayout(4, false);
    gridLayout.marginWidth = 0;
    gridLayout.marginHeight = 0;
    setLayout(gridLayout);

    GridData gridData = new GridData(SWT.LEFT, SWT.BOTTOM, false, false);
    gridData.heightHint = 21;

    iconLabel = new Label(this, SWT.NONE);
    iconLabel.setLayoutData(gridData);

    titleLabel = new Label(this, SWT.NONE);
    titleLabel.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));

    closeButton = new ImageButton(this, OM.getImage("icons/close_hover.gif"), OM.getImage("icons/close.gif"))
    {
      @Override
      protected void widgetSelected()
      {
        OM.PREF_DASHBOARD_HEIGHT.setValue(-OM.PREF_DASHBOARD_HEIGHT.getValue());
        CDOCheckoutDashboard.this.dispose();
      }
    };

    closeButton.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false));
    closeButton.setToolTipText("Close");

    Label space = new Label(this, SWT.NONE);
    space.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));

    stackComposite = new StackComposite(this, SWT.NONE);
    stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));

    infoPage = new InfoPage(this);
    viewPage = new ViewPage(this);
    transactionPage = new TransactionPage(this);
    stackComposite.setTopControl(infoPage);

    setSelection(selectionService.getSelection());
    selectionService.addSelectionListener(this);
  }

  @Override
  public void dispose()
  {
    selectionService.removeSelectionListener(this);
    super.dispose();
  }

  public void selectionChanged(IWorkbenchPart part, ISelection selection)
  {
    setSelection(selection);
  }

  public void setSelection(ISelection selection)
  {
    DashboardPage oldPage = currentPage;

    CDOView view = getView(selection);
    if (view != currentView)
    {
      currentView = view;

      if (currentView != null)
      {
        if (isReadOnly(currentView))
        {
          transactionPage.setView(null);
          currentPage = viewPage;
        }
        else
        {
          viewPage.setView(null);
          currentPage = transactionPage;
        }

        currentPage.setView(currentView);
      }
      else
      {
        viewPage.setView(null);
        transactionPage.setView(null);
        currentPage = infoPage;
      }
    }

    if (currentPage != oldPage)
    {
      updateTitleArea(currentPage);
      stackComposite.setTopControl(currentPage);
    }
  }

  private boolean isReadOnly(CDOView view)
  {
    // Object checkout = view.properties().get(CDOCheckout.class.getName());
    // if (checkout instanceof CDOCheckout)
    // {
    // return ((CDOCheckout)checkout).isReadOnly();
    // }

    return view.isReadOnly();
  }

  private CDOView getView(ISelection selection)
  {
    if (selection instanceof IStructuredSelection)
    {
      IStructuredSelection ssel = (IStructuredSelection)selection;
      if (!ssel.isEmpty())
      {
        CDOView firstView = null;
        for (Iterator<?> it = ssel.iterator(); it.hasNext();)
        {
          Object element = it.next();

          CDOCheckout checkout = AdapterUtil.adapt(element, CDOCheckout.class);
          if (checkout != null)
          {
            CDOView view = checkout.getView();
            if (view != null)
            {
              element = view;
            }
          }

          EObject eObject = AdapterUtil.adapt(element, EObject.class);
          if (eObject != null)
          {
            CDOObject cdoObject = CDOUtil.getCDOObject(eObject, false);
            if (cdoObject != null)
            {
              CDOView view = cdoObject.cdoView();
              if (view != null)
              {
                element = view;
              }
            }
          }

          CDOView view = AdapterUtil.adapt(element, CDOView.class);
          if (view != null)
          {
            if (firstView == null)
            {
              firstView = view;
            }
            else
            {
              if (firstView != view)
              {
                return null;
              }
            }
          }
        }

        return firstView;
      }
    }

    return null;
  }

  private StackComposite getStackComposite()
  {
    return stackComposite;
  }

  private void updateTitleArea(DashboardPage page)
  {
    if (page == currentPage)
    {
      iconLabel.setImage(page.getIcon());
      titleLabel.setText(page.getTitle());
    }
  }

  /**
   * @author Eike Stepper
   */
  public static abstract class DashboardPage extends Composite
  {
    private final CDOCheckoutDashboard dashboard;

    private Image icon;

    private String title;

    private CDOView view;

    public DashboardPage(CDOCheckoutDashboard dashboard)
    {
      super(dashboard.getStackComposite(), SWT.NONE);
      this.dashboard = dashboard;
    }

    public final Image getIcon()
    {
      return icon;
    }

    public final void setIcon(Image icon)
    {
      if (this.icon != icon)
      {
        this.icon = icon;
        dashboard.updateTitleArea(this);
      }
    }

    public final String getTitle()
    {
      return title;
    }

    public final void setTitle(String title)
    {
      if (this.title != title)
      {
        this.title = title;
        dashboard.updateTitleArea(this);
      }
    }

    public final CDOView getView()
    {
      return view;
    }

    public final void setView(CDOView view)
    {
      if (view != this.view)
      {
        CDOView oldView = this.view;
        this.view = view;
        viewChanged(oldView, view);
      }
    }

    protected void viewChanged(CDOView oldView, CDOView newView)
    {
    }
  }

  /**
   * @author Eike Stepper
   */
  private static class InfoPage extends DashboardPage
  {
    public InfoPage(CDOCheckoutDashboard dashboard)
    {
      super(dashboard);
      setIcon(org.eclipse.net4j.ui.shared.SharedIcons.getImage(org.eclipse.net4j.ui.shared.SharedIcons.OBJ_INFO));
      setTitle("CDO Dashboard");
      setLayout(new FillLayout());

      Label label = new Label(this, SWT.WRAP);
      label.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE));
      label.setText("This dashboard is context-sensitive. "
          + "Select checkouts or models to show view and transaction controls.");
    }
  }

  /**
   * @author Eike Stepper
   */
  private static class ViewPage extends DashboardPage
  {
    private final TimeSlider timeSlider;

    public ViewPage(CDOCheckoutDashboard dashboard)
    {
      super(dashboard);
      setIcon(SharedIcons.getImage(SharedIcons.OBJ_EDITOR_HISTORICAL));
      setTitle("View time:");
      setLayout(new FillLayout());

      timeSlider = new TimeSlider(this, SWT.HORIZONTAL);
    }

    @Override
    protected void viewChanged(CDOView oldView, CDOView newView)
    {
      super.viewChanged(oldView, newView);
      timeSlider.connect(newView, null);
    }
  }

  /**
   * @author Eike Stepper
   */
  private static class TransactionPage extends DashboardPage
  {
    private final Text commentText;

    private final Button promptButton;

    private final Button locksButton;

    public TransactionPage(CDOCheckoutDashboard dashboard)
    {
      super(dashboard);
      setIcon(SharedIcons.getImage(SharedIcons.OBJ_EDITOR));
      setTitle("Transaction commit comment:");

      GridLayout gridLayout = new GridLayout(2, false);
      gridLayout.marginWidth = 0;
      gridLayout.marginHeight = 0;
      setLayout(gridLayout);

      commentText = new Text(this, SWT.BORDER | SWT.WRAP | SWT.MULTI);
      commentText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));

      promptButton = new Button(this, SWT.CHECK);
      promptButton.setText("Prompt");
      promptButton.setToolTipText("Prompt on commit");

      locksButton = new Button(this, SWT.CHECK);
      locksButton.setText("Release locks");
      locksButton.setToolTipText("Release locks on commit");
    }
  }
}
