/*
 * Copyright (c) 2013 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:
 *    Christian W. Damus (CEA LIST) - initial API and implementation
 */
package org.eclipse.net4j.util.ui.confirmation;

import org.eclipse.net4j.util.confirmation.Confirmation;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * @author Christian W. Damus (CEA LIST)
 *
 * @since 3.4
 */
public class ConfirmationDialog extends MessageDialog
{
  public ConfirmationDialog(Shell shell, String title, String message, Set<Confirmation> acceptableResponses,
      Confirmation suggestedResponse)
  {
    this(shell, title, message, getButtonLabels(inOrder(acceptableResponses)),
        inOrder(acceptableResponses).indexOf(suggestedResponse));
  }

  private ConfirmationDialog(Shell shell, String title, String message, String[] buttonLabels, int defaultIndex)
  {
    super(shell, title, null, message, MessageDialog.CONFIRM, buttonLabels, defaultIndex);
  }

  public static Confirmation openConfirm(Shell shell, String title, String message,
      Set<Confirmation> acceptableResponses, Confirmation suggestedResponse)
  {
    List<Confirmation> inOrder = inOrder(acceptableResponses);
    String[] buttonLabels = getButtonLabels(inOrder);
    int defaultIndex = inOrder.indexOf(suggestedResponse);

    ConfirmationDialog dialog = new ConfirmationDialog(shell, title, message, buttonLabels, defaultIndex);
    int index = dialog.open();
    return index == SWT.DEFAULT ? suggestedResponse : inOrder.get(index);
  }

  private static String[] getButtonLabels(List<Confirmation> acceptableResponses)
  {
    List<String> result = new ArrayList<String>(acceptableResponses.size());

    for (Confirmation confirmation : acceptableResponses)
    {
      result.add(getLabel(confirmation));
    }

    return result.toArray(new String[result.size()]);
  }

  private static List<Confirmation> inOrder(Collection<Confirmation> confirmations)
  {
    List<Confirmation> result = new ArrayList<Confirmation>(confirmations);
    Collections.sort(result);
    return result;
  }

  private static String getLabel(Confirmation confirmation)
  {
    switch (confirmation)
    {
    case OK:
      return IDialogConstants.OK_LABEL;
    case CANCEL:
      return IDialogConstants.CANCEL_LABEL;
    case YES:
      return IDialogConstants.YES_LABEL;
    case NO:
      return IDialogConstants.NO_LABEL;
    }

    throw new IllegalArgumentException(confirmation.name());
  }
}
