/*******************************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jsch.ui;

import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jsch.core.IJSchService;
import org.eclipse.jsch.internal.ui.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import com.jcraft.jsch.*;

/**
 * A {@link UserInfo} prompter implementation that can be used when connecting a
 * {@link Session}.
 * <p>
 * Clients may instantiate or subclass this class.
 * 
 * @since 1.0
 * @see IJSchService#createSession(String, int, String)
 * @see IJSchService#connect(Session, int,
 *      org.eclipse.core.runtime.IProgressMonitor)
 */
public class UserInfoPrompter implements UserInfo, UIKeyboardInteractive{

  private String passphrase;
  private String password;
  private final Session session;
  private int attemptCount;

  /**
   * Create a prompter for the given session. This constructor will associate
   * this prompter with the session using {@link Session#setUserInfo(UserInfo)}.
   * 
   * @param session
   *          the session
   */
  public UserInfoPrompter(Session session){
    super();
    this.session=session;
    session.setUserInfo(this);
  }

  /**
   * Return the session to which this prompter is assigned.
   * 
   * @return the session to which this prompter is assigned
   */
  public Session getSession(){
    return session;
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UserInfo#getPassphrase()
   */
  public String getPassphrase(){
    return passphrase;
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UserInfo#getPassword()
   */
  public String getPassword(){
    return password;
  }

  /**
   * Set the pass phrase to be used when connecting the session. Return
   * <code>null</code> if the pass phrase is not known.
   * 
   * @param passphrase
   *          the pass phrase to be used when connecting the session or
   *          <code>null</code>
   */
  public void setPassphrase(String passphrase){
    this.passphrase=passphrase;
  }

  /**
   * Set the password to be used when connecting the session. Return
   * <code>null</code> if the password is not known.
   * 
   * @param password
   *          the password to be used when connecting the session or
   *          <code>null</code>
   */
  public void setPassword(String password){
    this.password=password;
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UserInfo#promptPassphrase(java.lang.String)
   */
  public boolean promptPassphrase(String message){
    String _passphrase=promptSecret(message);
    if(_passphrase!=null){
      setPassphrase(_passphrase);
    }
    return _passphrase!=null;
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UserInfo#promptPassword(java.lang.String)
   */
  public boolean promptPassword(String message){
    String _password=promptSecret(message);
    if(_password!=null){
      setPassword(_password);
    }
    return _password!=null;
  }

  private String promptSecret(final String message){
    // ask the user for a password
    final String[] result=new String[1];
    Display display=Display.getCurrent();
    if(display!=null){
      result[0]=promptForPassword(message);
    }
    else{
      // sync exec in default thread
      Display.getDefault().syncExec(new Runnable(){
        public void run(){
          result[0]=promptForPassword(message);
        }
      });
    }

    if(result[0]==null){
      throw new OperationCanceledException();
    }
    return result[0];
  }

  /* package */String promptForPassword(final String message){
    String username=getSession().getUserName();
    UserValidationDialog dialog=new UserValidationDialog(null, null,
        (username==null) ? "" : username, message); //$NON-NLS-1$
    dialog.setUsernameMutable(false);
    dialog.open();
    return dialog.getPassword();
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UIKeyboardInteractive#promptKeyboardInteractive(java.lang.String,
   *      java.lang.String, java.lang.String, java.lang.String[], boolean[])
   */
  public String[] promptKeyboardInteractive(String destination, String name,
      String instruction, String[] prompt, boolean[] echo){
    if(prompt.length==0){
      // No need to prompt, just return an empty String array
      return new String[0];
    }
    try{
      if(attemptCount==0&&password!=null&&prompt.length==1
          &&prompt[0].trim().equalsIgnoreCase("password:")){ //$NON-NLS-1$
        // Return the provided password the first time but always prompt on
        // subsequent tries
        attemptCount++;
        return new String[] {password};
      }
      String[] result=promptForKeyboradInteractiveInUI(destination, name,
          instruction, prompt, echo);
      if(result==null)
        return null; // canceled
      if(result.length==1&&prompt.length==1
          &&prompt[0].trim().equalsIgnoreCase("password:")){ //$NON-NLS-1$
        password=result[0];
      }
      attemptCount++;
      return result;
    }
    catch(OperationCanceledException e){
      return null;
    }
  }

  private String[] promptForKeyboradInteractiveInUI(final String destination,
      final String name, final String instruction, final String[] prompt,
      final boolean[] echo){
    final String[][] result=new String[1][];
    Display display=Display.getCurrent();
    if(display!=null){
      result[0]=internalPromptForUserInteractive(destination, name,
          instruction, prompt, echo);
    }
    else{
      // sync exec in default thread
      Display.getDefault().syncExec(new Runnable(){
        public void run(){
          result[0]=internalPromptForUserInteractive(destination, name,
              instruction, prompt, echo);
        }
      });
    }
    return result[0];
  }

  /* package */ String[] internalPromptForUserInteractive(String destination,
      String name, String instruction, String[] prompt, boolean[] echo){
    String domain=null;
    String userName=getSession().getUserName();
    KeyboardInteractiveDialog dialog=new KeyboardInteractiveDialog(null,
        domain, destination, name, userName, instruction, prompt, echo);
    dialog.open();
    String[] _result=dialog.getResult();
    return _result;
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UserInfo#promptYesNo(java.lang.String)
   */
  public boolean promptYesNo(String question){
    int prompt=prompt(MessageDialog.QUESTION, Messages.UserInfoPrompter_0,
        question, new int[] {IDialogConstants.YES_ID, IDialogConstants.NO_ID},
        0 // yes
    // the
    // default
    );
    return prompt==0;
  }

  /*
   * (non-Javadoc)
   * 
   * @see com.jcraft.jsch.UserInfo#showMessage(java.lang.String)
   */
  public void showMessage(String message){
    prompt(MessageDialog.INFORMATION, Messages.UserInfoPrompter_1, message,
        new int[] {IDialogConstants.OK_ID}, 0);
  }

  private int prompt(final int promptType, final String title,
      final String message, final int[] promptResponses,
      final int defaultResponse){
    final Display display=getStandardDisplay();
    final int[] retval=new int[1];
    final String[] buttons=new String[promptResponses.length];
    for(int i=0; i<promptResponses.length; i++){
      int prompt=promptResponses[i];
      switch(prompt){
        case IDialogConstants.OK_ID:
          buttons[i]=IDialogConstants.OK_LABEL;
          break;
        case IDialogConstants.CANCEL_ID:
          buttons[i]=IDialogConstants.CANCEL_LABEL;
          break;
        case IDialogConstants.NO_ID:
          buttons[i]=IDialogConstants.NO_LABEL;
          break;
        case IDialogConstants.YES_ID:
          buttons[i]=IDialogConstants.YES_LABEL;
          break;
      }
    }

    display.syncExec(new Runnable(){
      public void run(){
        final MessageDialog dialog=new MessageDialog(new Shell(display), title,
            null /* title image */, message, promptType, buttons,
            defaultResponse);
        retval[0]=dialog.open();
      }
    });
    return retval[0];
  }

  private Display getStandardDisplay(){
    Display display=Display.getCurrent();
    if(display==null){
      display=Display.getDefault();
    }
    return display;
  }

}
