/*
 * Created on 08-Jun-2004
 * Created by Paul Gardner
 * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * 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 General Public License for more details.
 * You should have received a copy of the GNU 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, USA.
 * 
 * AELITIS, SAS au capital de 46,603.30 euros
 * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
 *
 */

package org.gudy.azureus2.ui.swt.auth;

/**
 * @author parg
 *
 */

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogAlert;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.security.SESecurityManager;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.mainwindow.SWTThread;


public class 
CertificateCreatorWindow 
{
	public
	CertificateCreatorWindow()
	{
		createCertificate();
	}
	
	public void
	createCertificate()
	{
		final Display	display = SWTThread.getInstance().getDisplay();
		
		if ( display.isDisposed()){

			return;
		}
		
		try{
			display.asyncExec(
					new AERunnable()
					{
						public void
						runSupport()
						{
							 new createDialog( display );
						}
					});
		}catch( Throwable e ){
			
			Debug.printStackTrace( e );
		}
	}
	
	protected class
	createDialog
	{
		protected Shell			shell;
				
		protected
		createDialog(
			Display				display )
		{
			if ( display.isDisposed()){
				
				return;
			}
			
			shell = new Shell (display,SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
			
			Utils.setShellIcon(shell);
			Messages.setLanguageText(shell, "security.certcreate.title");
			
			GridLayout layout = new GridLayout();
			layout.numColumns = 3;
			
			shell.setLayout (layout);
			
			GridData gridData;
			
			// info
			
			Label info_label = new Label(shell,SWT.NULL);
			Messages.setLanguageText(info_label, "security.certcreate.intro");
			gridData = new GridData(GridData.FILL_BOTH);
			gridData.horizontalSpan = 3;
			info_label.setLayoutData(gridData);
			
			// alias
			
			Label alias_label = new Label(shell,SWT.NULL);
			Messages.setLanguageText(alias_label, "security.certcreate.alias");
			gridData = new GridData(GridData.FILL_BOTH);
			gridData.horizontalSpan = 1;
			alias_label.setLayoutData(gridData);
			
			final Text alias_field =new Text(shell,SWT.BORDER);
			
			alias_field.setText( SESecurityManager.DEFAULT_ALIAS );
			
			gridData = new GridData(GridData.FILL_BOTH);
			gridData.horizontalSpan = 2;
			alias_field.setLayoutData(gridData);
			
			// strength
			
			Label strength_label = new Label(shell,SWT.NULL);
			Messages.setLanguageText(strength_label, "security.certcreate.strength");
			gridData = new GridData(GridData.FILL_BOTH);
			gridData.horizontalSpan = 1;
			strength_label.setLayoutData(gridData);
			
			final Combo strength_combo = new Combo(shell, SWT.SINGLE | SWT.READ_ONLY);
			   
			final int[] strengths = { 512, 1024, 1536, 2048 };
			   			      
			for (int i=0;i<strengths.length;i++){
				
				strength_combo.add(""+strengths[i]);
			}
			      
			strength_combo.select(1);
			
			new Label(shell,SWT.NULL);
			      
			// first + last name
			
			String[]	field_names = { 
									"security.certcreate.firstlastname",
									"security.certcreate.orgunit",
									"security.certcreate.org",
									"security.certcreate.city",
									"security.certcreate.state",
									"security.certcreate.country"
								};
			
			final String[]		field_rns = {"CN", "OU", "O", "L", "ST", "C" };
			
			final Text[]		fields = new Text[field_names.length];
			
			for (int i=0;i<fields.length;i++){
				
				Label resource_label = new Label(shell,SWT.NULL);
				Messages.setLanguageText(resource_label, field_names[i]);
				gridData = new GridData(GridData.FILL_BOTH);
				gridData.horizontalSpan = 1;
				resource_label.setLayoutData(gridData);
				
				Text field = fields[i] = new Text(shell,SWT.BORDER);
				gridData = new GridData(GridData.FILL_BOTH);
				gridData.horizontalSpan = 2;
				field.setLayoutData(gridData);
			}

				// line
			
			Label labelSeparator = new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL);
			gridData = new GridData(GridData.FILL_HORIZONTAL);
			gridData.horizontalSpan = 3;
			labelSeparator.setLayoutData(gridData);
			
				// buttons
			
			new Label(shell,SWT.NULL);
			
			Composite comp = new Composite(shell,SWT.NULL);
			gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END | GridData.HORIZONTAL_ALIGN_FILL);
			gridData.grabExcessHorizontalSpace = true;
			gridData.horizontalSpan = 2;
			comp.setLayoutData(gridData);
			GridLayout layoutButtons = new GridLayout();
			layoutButtons.numColumns = 2;
			comp.setLayout(layoutButtons);
			
			
			
			Button bYes = new Button(comp,SWT.PUSH);
			Messages.setLanguageText(bYes, "security.certcreate.ok");
			gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END | GridData.HORIZONTAL_ALIGN_FILL);
			gridData.grabExcessHorizontalSpace = true;
			gridData.widthHint = 70;
			bYes.setLayoutData(gridData);
			bYes.addListener(SWT.Selection,new Listener() {
				public void handleEvent(Event e) {
					
					String	alias	= alias_field.getText().trim();
					
					int		strength	= strengths[strength_combo.getSelectionIndex()];
					
					String	dn = "";
					
					for (int i=0;i<fields.length;i++){
						
						String	rn = fields[i].getText().trim();
						
						if ( rn.length() == 0 ){
							
							rn = "Unknown";
						}
						
						dn += (dn.length()==0?"":",") + field_rns[i] + "=" + rn;
					}
										
					try{
						SESecurityManager.createSelfSignedCertificate( alias, dn, strength );
						
						close(true );
						
						Logger.log(new LogAlert(LogAlert.UNREPEATABLE,
								LogAlert.AT_INFORMATION, MessageText
										.getString("security.certcreate.createok")
										+ "\n" + alias + ":" + strength + "\n"
										+ dn + "\n" + SystemTime.getCurrentTime()));
						
					}catch( Throwable f ){
						
						Logger.log(new LogAlert(LogAlert.UNREPEATABLE, MessageText
								.getString("security.certcreate.createfail")
								+ "\n" + SystemTime.getCurrentTime(), f));
					}
				}
			});
			
			Button bNo = new Button(comp,SWT.PUSH);
			Messages.setLanguageText(bNo, "security.certcreate.cancel");
			gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
			gridData.grabExcessHorizontalSpace = false;
			gridData.widthHint = 70;
			bNo.setLayoutData(gridData);    
			bNo.addListener(SWT.Selection,new Listener() {
				public void handleEvent(Event e) {
					close(false);
				}
			});
			
			shell.setDefaultButton( bYes );
			
			shell.addListener(SWT.Traverse, new Listener() {	
				public void handleEvent(Event e) {
					if ( e.character == SWT.ESC){
						close( false );
					}
				}
			});

			
			shell.pack ();
			
			Utils.centreWindow( shell );

			shell.open ();   
		}
		
		protected void
		close(
			boolean		ok )
		{	
			shell.dispose();
		}
	}	
}