/*******************************************************************************
 * Copyright (c) 2020 RBEI and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v. 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *		Adhith Gopal - Initial contribution and API
 *		Pavithra Krishna Reddy
 *		Deepthi Murugaiyan
 *******************************************************************************/
package org.eclipse.blockchain.ui.views;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.blockchain.core.BlockchainCore;
import org.eclipse.blockchain.core.CoreCommandExecutor;
import org.eclipse.blockchain.ui.Activator;
import org.eclipse.blockchain.ui.util.UIUtilities;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
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;

/**
 *
 */
public class GethServerDialog extends Dialog {

	private Text dataDirText;
	private Text initFileText;
	private final String userDir = System.getProperty("user.dir");
	private String networkId = "";
	private Label networkIdLabel;
	private final Map<String, String> gethOptions = new HashMap<>();
	private String dataDirectory = "";
	private String genesisFile = "";

	/**
	 * @return -
	 */
	public String getDataDirectory() {
		return this.dataDirectory;
	}

	/**
	 * @return -
	 */
	public String getGenesisFile() {
		return this.genesisFile;
	}

	/**
	 * @return -
	 */
	public Map<String, String> getGethOptions() {
		return this.gethOptions;
	}

	/**
	 * @param parentShell
	 *            -
	 */
	public GethServerDialog(final Shell parentShell) {
		super(parentShell);
		populateGethOptions();
	}

	private void populateGethOptions() {
		this.gethOptions.put("rpc", "");
		this.gethOptions.put("rpccorsdomain", "*");
		this.gethOptions.put("rpcapi", "db,eth,net,web3,personal");
		this.gethOptions.put("gcmode", "archive");
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void configureShell(final Shell shell) {
		super.configureShell(shell);
		shell.setText("Geth Server Setup");
		shell.setSize(300, 400);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected Control createDialogArea(final Composite parent) {
		Composite containerComp = new Composite(parent, SWT.None);
		containerComp.setLayout(new GridLayout(3, false));
		containerComp
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

		createContent(containerComp);
		UIUtilities.moveShellToCenterOfScreen(Display.getDefault(),
				parent.getShell());
		return parent;
	}

	private void createContent(final Composite containerComp) {
		// First Layer
		Label dataDirLabel = new Label(containerComp, SWT.None);
		dataDirLabel.setText("Data Directory");
		dataDirLabel
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));

		this.dataDirText = new Text(containerComp, SWT.BORDER);
		this.dataDirText
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
		this.dataDirText.setText("C:\\Deepthi\\BlockChain\\Account\\Node4");
		this.dataDirText.setToolTipText(this.dataDirText.getText());

		Button dataDirBrowse = new Button(containerComp, SWT.PUSH);
		dataDirBrowse
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
		dataDirBrowse.setText("Browse");
		dataDirBrowse.addSelectionListener(new SelectionAdapter() {

			/**
			 * {@inheritDoc}
			 */
			@Override
			public void widgetSelected(final SelectionEvent e) {
				getAndSetSelectedDirectoryNode(containerComp,
						GethServerDialog.this.dataDirText);
			}
		});

		// Second Layer
		Label initFileLabel = new Label(containerComp, SWT.None);
		initFileLabel.setText("Init File");
		initFileLabel
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));

		this.initFileText = new Text(containerComp, SWT.BORDER);
		this.initFileText
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
		this.initFileText.setText("");
		this.initFileText.setToolTipText(this.initFileText.getText());

		Button initFileBrowse = new Button(containerComp, SWT.PUSH);
		initFileBrowse
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
		initFileBrowse.setText("Browse");
		initFileBrowse.addSelectionListener(new SelectionAdapter() {

			/**
			 * {@inheritDoc}
			 */
			@Override
			public void widgetSelected(final SelectionEvent e) {
				getandSetSelectedGenesisFile(containerComp,
						GethServerDialog.this.initFileText);
			}
		});

		// Scrolled Composite - contains network values
		ScrolledComposite networkComposite = new ScrolledComposite(
				containerComp, SWT.V_SCROLL | SWT.BORDER);
		networkComposite.setLayout(new GridLayout(1, false));
		networkComposite.setLayoutData(
				new GridData(SWT.FILL, SWT.FILL, false, false, 3, 0));
		Composite networkChild = createdScrolledContent(networkComposite);

		networkComposite.setContent(networkChild);
		networkComposite.setMinSize(
				networkComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		networkComposite.setExpandHorizontal(true);
		networkComposite.setExpandVertical(true);
		networkComposite.layout();
	}

	private Composite createdScrolledContent(
			final ScrolledComposite scrolledComposite) {
		/**
		 * This contains the geth arguments which should be made configurable,
		 * as of now its static but networkId will be read from the genesis file
		 */
		Composite childComp = new Composite(scrolledComposite, SWT.None);
		childComp.setLayout(new GridLayout(1, false));
		childComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

		Group networkGroup = new Group(childComp, SWT.BORDER);
		networkGroup.setLayout(new GridLayout(1, false));
		networkGroup
				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		networkGroup.setText("Network");

		this.networkIdLabel = new Label(networkGroup, SWT.None | SWT.READ_ONLY);
		this.networkIdLabel.setText("Network ID : " + (this.networkId.isEmpty()
				? CoreCommandExecutor.getInstance().getDefaultNetworkIdForGeth()
				: this.networkId));

		Group rpcGroup = new Group(childComp, SWT.BORDER);
		rpcGroup.setLayout(new GridLayout(1, false));
		rpcGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		rpcGroup.setText("RPC");

		for (Map.Entry<String, String> entry : this.gethOptions.entrySet()) {
			Label lab = new Label(rpcGroup, SWT.None);
			String val = entry.getValue();
			lab.setText(entry.getKey() + (val.isEmpty() ? "" : " : " + val));
		}
		return childComp;
	}

	private void getandSetSelectedGenesisFile(final Composite parent,
			final Text textWidget) {
		FileDialog dataDir = new FileDialog(parent.getShell());
		dataDir.setFilterPath(this.userDir);
		String selectedDir = dataDir.open();
		textWidget.setText(selectedDir);
		try (BufferedReader br = new BufferedReader(
				new FileReader(new File(selectedDir)))) {
			String contents = "";
			while ((contents = br.readLine()) != null) {
				if (contents.contains("chainId")) {
					this.networkId = contents
							.substring(contents.indexOf(':') + 1)
							.replace(",", "").trim();
					this.networkIdLabel
							.setText("Network ID : " + this.networkId);
					this.networkIdLabel.getParent().layout();
				}
			}
		} catch (IOException e) {
			BlockchainCore.getInstance().logException(Activator.PLUGIN_ID,
					e.getMessage(), e);
		}
	}

	private void getAndSetSelectedDirectoryNode(final Composite parent,
			final Text textWidget) {
		DirectoryDialog dirDialog = new DirectoryDialog(parent.getShell());
		dirDialog.setFilterPath(this.userDir);
		String selectedDir = dirDialog.open();
		textWidget.setText(selectedDir);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void okPressed() {
		this.dataDirectory = this.dataDirText.getText();
		this.genesisFile = this.initFileText.getText();
		super.okPressed();
	}

}