///////////////////////////////////////////////////////////////////////////
// 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.InputStream;
import java.util.Scanner;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.IShellProvider;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;

import com.intel.sgx.Activator;

public abstract class SGXDialogBase extends Dialog {

	protected Shell shell;
	public Text configFileField;
	public static FilteredResourcesSelectionDialog dialogForConfig(Shell shell) {
		// final IContainer container = ResourcesPlugin.getWorkspace().getRoot();
		
		final IContainer container = SGXDialogBase.getCurrentProject();

		FilteredResourcesSelectionDialog d = new FilteredResourcesSelectionDialog(
				shell, false, container, IResource.FILE) {
			{
				setInitialPattern("**");
			}

			@Override
			protected IStatus validateItem(Object item) {
				// return Status.OK_STATUS;
				IFile f = (IFile) item;
				if (f.getParent() instanceof IProject) {
					return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
							"The selected resource has to be part of the source folder");
				}
				
				
				return super.validateItem(item);
			}

			protected ItemsFilter createFilter() {
				return new ResourceFilter(container, true, IResource.FILE) {

					@Override
					public boolean matchItem(Object item) {
						return isConfigFile(item);
					}

					private boolean isConfigFile(Object item) {
						if (!(item.toString().endsWith(".xml") && super
								.matchItem(item))) {
							return false;
						}
						try {
							IFile iFile = (IFile) item;
							return streamContainsString(iFile.getContents(),
									"<EnclaveConfiguration>");
						} catch (Throwable e) {
							return false;
						}
					}

				};

			}

			public boolean streamContainsString(InputStream is,
					String searchString) {
				Scanner streamScanner = new Scanner(is);
				if (streamScanner.findWithinHorizon(searchString, 0) != null) {
					return true;
				} else {
					return false;
				}
			}

		};
		return d;
	}


	
	protected SelectionListener configFileSelectionListener = new SelectionListener() {
				@Override
				public void widgetSelected(SelectionEvent event) {
		
					FilteredResourcesSelectionDialog d = dialogForConfig(shell);
					d.setTitle("Select Config File");
					if (d.open() == Dialog.OK) {
						IFile target = (IFile) d.getResult()[0];
						configFileField.setText(target.getLocation().toOSString());
					}
					;
				}
		
				@Override
				public void widgetDefaultSelected(SelectionEvent arg0) {
					// TODO Auto-generated method stub
		
				}
				
			};

	public SGXDialogBase(Shell parentShell) {
		super(parentShell);
	}

	public SGXDialogBase(IShellProvider parentShell) {
		super(parentShell);
	}

	protected Text addGroup(Composite composite, String title, String subtitle,
			String label, String selectButtonLabel, SelectionListener selectionListener) {
				final Group container = new Group(composite, SWT.None);
				container.setLayout(new GridLayout(3, false));
				GridData innergrid1 = new GridData(GridData.FILL_HORIZONTAL);
				innergrid1.horizontalSpan = 3;
				container.setLayoutData(innergrid1);
				container.setText(title);
			
				final Label messageLabel = new Label(container, SWT.NONE);
				messageLabel.setLayoutData(new GridData(GridData.BEGINNING,
						GridData.CENTER, false, false, 3, 1));
				messageLabel.setText(subtitle);
			
				final Label messageLabel1 = new Label(container, SWT.NONE);
				messageLabel1.setText(label);
				messageLabel1.setLayoutData(new GridData(GridData.BEGINNING));
			
				Text directoryNameField = new Text(container, SWT.SINGLE | SWT.BORDER);
				GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
				gridData.horizontalSpan = 1;
				gridData.widthHint = 400;
				directoryNameField.setLayoutData(gridData);
			
				final Button selectButton = new Button(container, SWT.PUSH);
				selectButton.setText(selectButtonLabel);
				GridData buttonGridData = new GridData(GridData.END);
				buttonGridData.horizontalAlignment = SWT.RIGHT;
				buttonGridData.horizontalSpan = 1;
				buttonGridData.minimumWidth = 120;
				selectButton.setLayoutData(buttonGridData);
				selectButton.addSelectionListener(selectionListener);
				return directoryNameField;
			}

	
	public IPath getCurrentProjectPath() {
		IProject project = getCurrentProject();
		
		IPath path = null;
		if (project != null) {
			path = project.getLocation();
		}
		return path;
	}

	static public IProject getCurrentProject() {
		IProject project = null;

		
		IWorkbenchWindow window = PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow();
		if (window != null) {
			IStructuredSelection selection = (IStructuredSelection) window
					.getSelectionService().getSelection();
			Object firstElement = selection.getFirstElement();
			if (firstElement instanceof IAdaptable) {
				project = (IProject) ((IAdaptable) firstElement)
						.getAdapter(IProject.class);
			}
		}
		return project;
	}
	
	@Override
	protected void configureShell(Shell newShell){
		super.configureShell(newShell);
	}

	protected void addLabel(final Group container, String labelText) {
		final Label messageLabel = new Label(container, SWT.NONE);
		messageLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, false, 3, 1));
		messageLabel.setText(labelText);
	}

}
