///////////////////////////////////////////////////////////////////////////
// Copyright (c) 2018 Intel Corporation.				 //
// 									 //
// 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:							 //
//     Intel Corporation - initial implementation and documentation	 //
///////////////////////////////////////////////////////////////////////////


package com.intel.sgx.dialogs;

import java.io.File;

import javax.swing.JOptionPane;

import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.SWT;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.intel.sgx.handlers.UpdateSigningKey;

public class UpdateSignKeyDialog extends SGXDialogBase {

	private Shell shell;
	public Text sourceKeyFileField;
	public Text destinationKeyFileField;
	public static boolean regenerate = false;
	
	private final SelectionListener destinationKeyFileSelectionListener = new SelectionListener() {
		@Override
		public void widgetSelected(SelectionEvent event) {
			String result = destinationKeyFileField.getText();
			FileDialog dialog = new FileDialog(shell, SWT.OPEN);
			dialog.setFilterPath(getCurrentProjectPath().toOSString());
			dialog.setFilterExtensions(new String [] {"*.pem", "*"});
			result = dialog.open();
			destinationKeyFileField.setText(result);
		}
		@Override
		public void widgetDefaultSelected(SelectionEvent e) {
		}		
	};
	
	private final SelectionListener sourceKeyFileSelectionListener = new SelectionListener() {
		@Override
		public void widgetSelected(SelectionEvent event) {
			String result = sourceKeyFileField.getText();
			FileDialog dialog = new FileDialog(shell, SWT.OPEN);
			dialog.setFilterExtensions(new String [] {"*.pem", "*"});
			dialog.setFilterPath(getCurrentProjectPath().toOSString());
			result = dialog.open();
			sourceKeyFileField.setText(result);
		}
		@Override
		public void widgetDefaultSelected(SelectionEvent e) {
		}		
	};
	final private UpdateSigningKey handler;
	
	public UpdateSignKeyDialog(Shell parentShell, UpdateSigningKey handler) {
		super(parentShell);
		this.shell = parentShell;
		this.handler = handler;
		setShellStyle(SWT.RESIZE | SWT.TITLE);
	}

	@Override
	protected Control createDialogArea(Composite parent) {
		Composite composite = (Composite) super.createDialogArea(parent);
		final GridLayout gridLayout = new GridLayout(1,false);
		composite.setLayout(gridLayout);
		
		destinationKeyFileField = addGroup(composite, "Enclave Signing Key:",
				"Select the Signing Key to be Updated or Generated.",
				"Enclave Signing Key:", "Select", destinationKeyFileSelectionListener);

		sourceKeyFileField = addGroup(composite, "Import:",
				"To import your own Signing Key use the Import Signing Key option.",
				"Import Signing Key:", "Import Key", sourceKeyFileSelectionListener);

		addGroup2(composite);
		
		return composite;
	}

	protected void addGroup2(Composite composite) {
		final Group container2 = new Group(composite, SWT.None);
		container2.setLayout(new GridLayout(3,false));
		GridData innergrid2 = new GridData(GridData.FILL_HORIZONTAL);
		innergrid2.horizontalSpan = 3;
		container2.setLayoutData(innergrid2);
		container2.setText("Generate:");
		
		final Label messageLabel3 = new Label(container2, SWT.NONE);
		messageLabel3.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, false, 3, 1));
		messageLabel3.setText("To Generate a new Signing Key use the Generate Signing Key option.");
		
		Label warningLabel2 = new Label(container2,SWT.FILL | SWT.WRAP);
		warningLabel2.setText("Generate a new Signing Key:");
		warningLabel2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		
		Label dummy2 = new Label(container2,0);
		dummy2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		final Button updateSigningKey = new Button(container2, SWT.PUSH);
		updateSigningKey.setText("Generate Key");
		GridData buttonGridData2 = new GridData(GridData.END);
		buttonGridData2.horizontalAlignment = SWT.RIGHT;
		buttonGridData2.horizontalSpan = 1;
		buttonGridData2.minimumWidth = 120;
		updateSigningKey.setLayoutData(buttonGridData2);
		updateSigningKey.addSelectionListener(new SelectionListener() {
			@Override
			public void widgetSelected(SelectionEvent event) {
				if( !destinationKeyFileField.getText().isEmpty())
				{
					regenerate = true;
					UpdateSignKeyDialog.this.setReturnCode(InputDialog.OK);
					okPressed();
					UpdateSignKeyDialog.this.close();
				}
				else
					JOptionPane.showMessageDialog(null, "Enclave Signing Key field is not provided.", "Error",
							JOptionPane.ERROR_MESSAGE);
			}

			@Override
			public void widgetDefaultSelected(SelectionEvent e) {
			}		
		});
	}

	
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText("Import or (Re)Generate Enclave Signing Key");
	}

	@Override
	protected void okPressed() {
		
		handler.sourceKeyFile = sourceKeyFileField.getText();
		handler.destinationKeyFile = destinationKeyFileField.getText();
		if((!sourceKeyFileField.getText().isEmpty() &&  !destinationKeyFileField.getText().isEmpty() && 
				(new File(sourceKeyFileField.getText())).isFile())
				|| regenerate == true )
		{
			System.out.println("regenerate = " + regenerate);
			super.okPressed();
		}
		else
		{
			if(sourceKeyFileField.getText().isEmpty() && destinationKeyFileField.getText().isEmpty())
				JOptionPane.showMessageDialog(null, "Enclave Signing Key and Import Singing Key are not provided.", "Error",
					JOptionPane.ERROR_MESSAGE);
			else
			{
				if(sourceKeyFileField.getText().isEmpty())
					JOptionPane.showMessageDialog(null, "Import Singing Key is not provided.", "Error",
							JOptionPane.ERROR_MESSAGE);
				else
				if(!(new File(sourceKeyFileField.getText())).isFile())
					JOptionPane.showMessageDialog(null, "Invalid Import Singing Key.", "Error",
							JOptionPane.ERROR_MESSAGE);
				
				if(destinationKeyFileField.getText().isEmpty())
					JOptionPane.showMessageDialog(null, "Enclave Signing Key is not provided.", "Error",
							JOptionPane.ERROR_MESSAGE);
			}
		}
			
	}

	
	
}
