/*******************************************************************************
 * Copyright (C) 2007 The University of Manchester   
 * 
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 * 
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1 of
 *  the License, or (at your option) any later version.
 *    
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *    
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.workbench.ui.credentialmanager;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.security.cert.X509Certificate;
import java.util.ArrayList;

import javax.security.auth.x500.X500Principal;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.BoxLayout;
import javax.swing.ListSelectionModel;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import net.sf.taverna.t2.security.credentialmanager.CMX509Util;
import net.sf.taverna.t2.workbench.ui.credentialmanager.ViewCertDetailsDialog;

/**
 * Dialog that displays the details of all trusted certificates
 * keystore allowing the user to pick one or more for import.
 * 
 * @author Alex Nenadic
 */
class NewTrustCertsDialog
    extends JDialog
{

	private static final long serialVersionUID = 8702957635188643993L;

	/** List of trusted certs available for import */
    private JList jltTrustCerts;

    /** List of trusted certs available for import */
    private ArrayList<X509Certificate> availableTrustCerts = new ArrayList<X509Certificate>();
    
    /** List of trusted certs selected for import */
    private ArrayList<X509Certificate> selectedTrustCerts;
    
    /**
     * Creates new form NewTrustCertsDialog where the parent is a frame.
     */
    public NewTrustCertsDialog(JFrame parent, String title, boolean modal, ArrayList<X509Certificate> lCerts)
    {
        super(parent, title, modal);
        //System.arraycopy(lCerts, 0, trustCerts, 0, lCerts.length);
        availableTrustCerts = lCerts;
        initComponents();
    }
    
    /**
     * Creates new form NewTrustCertsDialog where the parent is a frame.
     */
    public NewTrustCertsDialog(JDialog parent, String title, boolean modal, ArrayList<X509Certificate> lCerts)
    {
        super(parent, title, modal);
        //System.arraycopy(lCerts, 0, trustCerts, 0, lCerts.length);
        availableTrustCerts = lCerts;
        initComponents();
    }

    /**
     * Initialise the dialog's GUI components.
     */
    private void initComponents()
    {
        // Instructions
        JLabel jlInstructions = new JLabel("Select one or more certificates for import:");
        jlInstructions.setFont(new Font(null, Font.PLAIN, 11));
        jlInstructions.setBorder(new EmptyBorder(5,5,5,5));
        JPanel jpInstructions = new JPanel(new BorderLayout());
        jpInstructions.add(jlInstructions, BorderLayout.WEST);

        // Import button
        final JButton jbImport = new JButton("Import");
        jbImport.setEnabled(false);
        jbImport.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                importPressed();
            }
        });

        // Certificate details button
        final JButton jbCertificateDetails = new JButton("Certificate Details");
        jbCertificateDetails.setEnabled(false);
        jbCertificateDetails.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                certificateDetailsPressed();
            }
        });

        // List to hold trusted certs' aliases
        jltTrustCerts = new JList();
        jltTrustCerts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
        jltTrustCerts.addListSelectionListener(new ListSelectionListener()
        {
            public void valueChanged(ListSelectionEvent evt)
            {
            	
                if (jltTrustCerts.getSelectedIndex() == -1) {
                    jbImport.setEnabled(false);
                    jbCertificateDetails.setEnabled(false);
                }
                else {
                    jbImport.setEnabled(true);
                    jbCertificateDetails.setEnabled(true);
                }
            }
        });
        // Populate the list
        // Get the certificate subjects' CNs
        ArrayList<String> cns = new ArrayList<String>();
        for (int i = 0; i < availableTrustCerts.size(); i++){
        	
    		String DN = ((X509Certificate) availableTrustCerts.get(i)).getSubjectX500Principal().getName(X500Principal.RFC2253);
    		CMX509Util util = new CMX509Util();
    		util.parseDN(DN);
    		
        	String CN = util.getCN();
        	cns.add(i, CN);
        }
        jltTrustCerts.setListData(cns.toArray());
        jltTrustCerts.setSelectedIndex(0);

        // Put the list into a scroll pane
        JScrollPane jspTrustCerts = new JScrollPane(jltTrustCerts,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jspTrustCerts.getViewport().setBackground(jltTrustCerts.getBackground());
        
        // Put all the trusted cert components together
        JPanel jpTrustCerts = new JPanel(); // BoxLayout
        jpTrustCerts.setLayout(new BoxLayout(jpTrustCerts, BoxLayout.Y_AXIS));
        //jpKeyPairs.setPreferredSize(new Dimension(400, 200));
        jpTrustCerts.setBorder(new CompoundBorder(new CompoundBorder(
            new EmptyBorder(5, 5, 5, 5), new EtchedBorder()), new EmptyBorder(
            5, 5, 5, 5)));
   
        jpInstructions.setAlignmentY(JPanel.LEFT_ALIGNMENT);
        jpTrustCerts.add(jpInstructions);
        jspTrustCerts.setAlignmentY(JPanel.LEFT_ALIGNMENT);
        jpTrustCerts.add(jspTrustCerts);
        jbCertificateDetails.setAlignmentY(JPanel.RIGHT_ALIGNMENT);
        jpTrustCerts.add(jbCertificateDetails);

        // Cancel button
        final JButton jbCancel = new JButton("Cancel");
        jbCancel.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                cancelPressed();
            }
        });

        JPanel jpButtons = new JPanel(new FlowLayout(FlowLayout.CENTER));
        jpButtons.add(jbImport);
        jpButtons.add(jbCancel);

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(jpTrustCerts, BorderLayout.CENTER);
        getContentPane().add(jpButtons, BorderLayout.SOUTH);

        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent evt)
            {
                closeDialog();
            }
        });

        setResizable(false);

        getRootPane().setDefaultButton(jbImport);

        pack();

    }

    /**
     * Certificate Details button pressed.  Display the selected key
     * pair's certificate.
     */
    private void certificateDetailsPressed()
    {
        try {        	
        	
        	int i = jltTrustCerts.getSelectedIndex();
            
        	X509Certificate cert = (X509Certificate) availableTrustCerts.get(i);

            // Supply the certificate to the view certificate dialog
            ViewCertDetailsDialog viewCertificateDialog = new ViewCertDetailsDialog(this,
            		"Certificate details", 
            		true, 
            		cert,
            		null);
            viewCertificateDialog.setLocationRelativeTo(this);
            viewCertificateDialog.setVisible(true);
            
        }
        catch (Exception ex) {
            JOptionPane.showMessageDialog(this,
                    "Failed to obtain certificate details to show.", 
                    "Credential Manager Alert",
                    JOptionPane.WARNING_MESSAGE);
            closeDialog();

        }
    }

    /**
     * Get the trusted certificates selected for import.
     *
     * @return The array of trusted certificates selected for import
     */
    public ArrayList<X509Certificate> getTrustedCertificates()
    {
    	return selectedTrustCerts;
    }

   
    /**
     * Import button pressed by user. Store the selected trusted certs
     * and close the dialog.
     */
    public void importPressed()
    {
    	int[] selectedValues = jltTrustCerts.getSelectedIndices();
    	selectedTrustCerts = new ArrayList<X509Certificate>();
    	for (int i= 0; i < selectedValues.length; i++){
    		selectedTrustCerts.add(availableTrustCerts.get(selectedValues[i]));
    	}

        closeDialog();
    }

    
    /**
     * Cancel button pressed - close the dialog.
     */
    public void cancelPressed()
    {
    	// Set selectedTrustCerts to null to indicate that user cancelled
    	selectedTrustCerts = null;
        closeDialog();
    }

    /**
     * Closes the dialog.
     */
    private void closeDialog()
    {
        setVisible(false);
        dispose();
    }
}

