/*******************************************************************************
 * Copyright (c) 2011 BSI Business Systems Integration AG.
 * 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:
 *     Daniel Wiehl (BSI Business Systems Integration AG) - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.sdk.ws.jaxws.swt.dialog;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
import org.eclipse.scout.sdk.ws.jaxws.Texts;
import org.eclipse.scout.sdk.ws.jaxws.marker.commands.IMarkerCommand;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;

public class CommandExecutionDialog extends TitleAreaDialog {

  // fields
  private FormToolkit m_toolkit;
  private SelectionListener m_selectAllSelectionListener;
  private String m_dialogTitle;
  private String m_headerMessage;

  // process fields
  private IMarkerCommand[] m_commands;

  // ui fields
  private Button m_selectAllButton;
  private Set<Button> m_commandSelectorFields;

  public CommandExecutionDialog(String dialogTitle) {
    super(ScoutSdkUi.getShell());
    m_dialogTitle = dialogTitle;

    m_toolkit = new FormToolkit(ScoutSdkUi.getDisplay());
    m_commandSelectorFields = new HashSet<Button>();
    setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE | getDefaultOrientation());
  }

  @Override
  protected final void configureShell(Shell shell) {
    super.configureShell(shell);
    if (m_dialogTitle != null) {
      shell.setText(m_dialogTitle);
    }
  }

  @Override
  protected Control createDialogArea(Composite parent) {
    // create the top level composite for the dialog area
    Composite composite = new Composite(parent, SWT.NONE);
    composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));

    if (m_headerMessage != null) {
      setMessage(m_headerMessage, IMessageProvider.WARNING);
    }
    setTitle(m_dialogTitle);
    setHelpAvailable(false);

    GridLayout gridLayout = new GridLayout();
    gridLayout.marginHeight = 0;
    gridLayout.marginWidth = 0;
    gridLayout.verticalSpacing = 0;
    gridLayout.horizontalSpacing = 0;
    composite.setLayout(gridLayout);

    // Build the separator line
    Label titleBarSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
    titleBarSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    // Build the form
    ScrolledForm form = m_toolkit.createScrolledForm(composite);
    form.setLayoutData(new GridData(GridData.FILL_BOTH));

    // Build the form body
    Composite formBody = form.getBody();
    TableWrapLayout tableWrapLayout = new TableWrapLayout();
    tableWrapLayout.makeColumnsEqualWidth = true;
    tableWrapLayout.numColumns = 1;
    formBody.setLayout(tableWrapLayout);

    createCommandSections(formBody);

    // Build the separator line
    Label separator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
    separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    m_selectAllButton = new Button(composite, SWT.CHECK);
    m_selectAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    ((GridData) m_selectAllButton.getLayoutData()).verticalIndent = 5;
    ((GridData) m_selectAllButton.getLayoutData()).horizontalIndent = 16;
    m_selectAllButton.setText(Texts.get("SelectAll"));
    m_selectAllButton.setEnabled(hasExecutableCommands());
    m_selectAllButton.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        for (Button button : m_commandSelectorFields) {
          button.setSelection(m_selectAllButton.getSelection());
          ((IMarkerCommand) button.getData()).setDoExecute(m_selectAllButton.getSelection());
        }
      }
    });

    form.updateToolBar();
    form.reflow(true);
    // form.getShell().layout();

    return composite;
  }

  protected void createCommandSections(Composite parent) {
    for (IMarkerCommand command : m_commands) {
      Composite section = createSection(parent, command.getProblemName(), command.getMarker().getAttribute(IMarker.MESSAGE, ""));

      int numOfColumns = 1;
      if (command.isExecutable()) {
        numOfColumns = 2;
      }

      section.setLayout(new GridLayout(numOfColumns, false));

      if (command.isExecutable()) {
        Button commandButton = m_toolkit.createButton(section, null, SWT.CHECK);
        m_commandSelectorFields.add(commandButton);
        GridData data = new GridData();
        data.verticalAlignment = SWT.TOP;
        data.horizontalAlignment = SWT.LEFT;
        commandButton.setLayoutData(data);
        commandButton.setData(command);
        commandButton.addSelectionListener(new SelectionAdapter() {

          @Override
          public void widgetSelected(SelectionEvent e) {
            Button checkBox = (Button) e.getSource();
            IMarkerCommand cmd = (IMarkerCommand) checkBox.getData();
            cmd.setDoExecute(checkBox.getSelection());
            checkForSelectAll();
          }
        });
      }

      Text solutionField = new Text(section, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
      solutionField.setText(command.getSolutionDescription());
      GridData gridData = new GridData();
      gridData.widthHint = 550; // this hint is just because of a bug in SWT. If not provided the text does not wrap at all.
      solutionField.setLayoutData(gridData);
    }
  }

  private boolean hasExecutableCommands() {
    for (IMarkerCommand command : m_commands) {
      if (command.isExecutable()) {
        return true;
      }
    }

    return false;
  }

  public void setCommands(IMarkerCommand[] commands) {
    m_commands = commands;
  }

  public void setHeaderMessage(String headerMessage) {
    m_headerMessage = headerMessage;
  }

  private void checkForSelectAll() {
    boolean selectAll = true;
    for (Button commandButton : m_commandSelectorFields) {
      selectAll = commandButton.getSelection();
      if (!selectAll) {
        break;
      }
    }

    m_selectAllButton.setSelection(selectAll);
  }

  private Composite createSection(Composite parent, String problemName, String problemDescription) {
    int style = Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED;

    // Build the section header
    Section section = m_toolkit.createSection(parent, style);
    section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
    section.setText(problemName);
    section.setDescription(problemDescription);

    // Build the section client
    Composite sectionClient = m_toolkit.createComposite(section);
    section.setClient(sectionClient);

    GridLayout gridLayout = new GridLayout(1, false);
    gridLayout.marginWidth = 0;
    gridLayout.verticalSpacing = 30;
    sectionClient.setLayout(gridLayout);

    Composite commandComposite = m_toolkit.createComposite(sectionClient);
    commandComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
    return commandComposite;
  }
}
