package org.flashtool.gui;

import java.io.File;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
import java.util.Vector;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Text;
import org.flashtool.gui.models.TableLine;
import org.flashtool.gui.models.TableSorter;
import org.flashtool.gui.models.VectorContentProvider;
import org.flashtool.gui.models.VectorLabelProvider;
import org.flashtool.gui.tools.USBParseJob;
import org.flashtool.parsers.simpleusblogger.Session;
//import org.eclipse.ui.forms.widgets.FormToolkit;
import org.flashtool.system.DeviceEntry;
import org.flashtool.system.Devices;
import org.flashtool.system.TextFile;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class USBLogviewer extends Dialog {

	protected Object result;
	protected Shell shlUSBLogviewer;
	private Table table;
	private TableViewer tableViewer;
	private Text textSinFolder;
	private Button btnClose;
	private Composite compositeTable;
	//private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
	private Label lblLogfile;
	private Text textLogFile;
	private Button btnParse;
	private Button btnLogFile;
	private Button btnSourceFolder;
	private Label lblSavedPath;

	/**
	 * Create the dialog.
	 * @param parent
	 * @param style
	 */
	public USBLogviewer(Shell parent, int style) {
		super(parent, style);
		setText("Device Selector");
	}

	/**
	 * Open the dialog.
	 * @return the result
	 */
	public Object open() {
		
		createContents();
		createTriggers();
		
		lblSavedPath = new Label(shlUSBLogviewer, SWT.NONE);
		FormData fd_lblSavedPath = new FormData();
		fd_lblSavedPath.right = new FormAttachment(btnParse, -6);
		fd_lblSavedPath.bottom = new FormAttachment(100, -15);
		fd_lblSavedPath.left = new FormAttachment(0, 10);
		lblSavedPath.setLayoutData(fd_lblSavedPath);
		
		
		shlUSBLogviewer.open();
		shlUSBLogviewer.layout();
		
		Display display = getParent().getDisplay();
		while (!shlUSBLogviewer.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		
		return result;
	}

	/**
	 * Create contents of the dialog.
	 */
	private void createContents() {
		shlUSBLogviewer = new Shell(getParent(), getStyle());
		shlUSBLogviewer.setSize(710, 475);
		shlUSBLogviewer.setText("USB Log Viewer");
		shlUSBLogviewer.setLayout(new FormLayout());
		
		btnClose = new Button(shlUSBLogviewer, SWT.NONE);
		FormData fd_btnClose = new FormData();
		fd_btnClose.bottom = new FormAttachment(100, -10);
		fd_btnClose.right = new FormAttachment(100, -10);
		btnClose.setLayoutData(fd_btnClose);
		btnClose.setText("Close");
		
		compositeTable = new Composite(shlUSBLogviewer, SWT.NONE);
		compositeTable.setLayout(new FillLayout(SWT.HORIZONTAL));
		FormData fd_compositeTable = new FormData();
		
		fd_compositeTable.right = new FormAttachment(100, -10);
		fd_compositeTable.left = new FormAttachment(0, 10);
		fd_compositeTable.bottom = new FormAttachment(btnClose, -6);
		compositeTable.setLayoutData(fd_compositeTable);
		
		tableViewer = new TableViewer(compositeTable,SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE);
		tableViewer.setContentProvider(new VectorContentProvider());
		tableViewer.setLabelProvider(new VectorLabelProvider());

		table = tableViewer.getTable();
		TableColumn[] columns = new TableColumn[2];
		columns[0] = new TableColumn(table, SWT.NONE);
		columns[0].setText("Action");
		columns[1] = new TableColumn(table, SWT.NONE);
		columns[1].setText("Parameter");
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		TableSorter sort = new TableSorter(tableViewer);
		Composite compositeSource = new Composite(shlUSBLogviewer, SWT.NONE);
		compositeSource.setLayout(new GridLayout(3, false));
		FormData fd_compositeSource = new FormData();
		fd_compositeSource.top = new FormAttachment(0, 10);
		fd_compositeSource.left = new FormAttachment(0, 10);
		fd_compositeSource.right = new FormAttachment(100, -10);
		compositeSource.setLayoutData(fd_compositeSource);
		
		fd_compositeTable.top = new FormAttachment(compositeSource, 6);
		
		lblLogfile = new Label(compositeSource, SWT.BORDER);
		lblLogfile.setText("USB Log file :");
		
		textLogFile = new Text(compositeSource, SWT.BORDER);
		textLogFile.setEditable(false);
		GridData gd_textLogFile = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
		gd_textLogFile.widthHint = 471;
		textLogFile.setLayoutData(gd_textLogFile);
		
		btnLogFile = new Button(compositeSource, SWT.NONE);
		btnLogFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
		btnLogFile.setText("...");
		
		Label lblSinfolder = new Label(compositeSource, SWT.NONE);
		GridData gd_lblSinfolder = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
		gd_lblSinfolder.widthHint = 110;
		lblSinfolder.setLayoutData(gd_lblSinfolder);
		lblSinfolder.setText("Source folder :");
		
		textSinFolder = new Text(compositeSource, SWT.BORDER);
		textSinFolder.setEditable(false);
		GridData gd_textSinFolder = new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1);
		gd_textSinFolder.widthHint = 509;
		textSinFolder.setLayoutData(gd_textSinFolder);
		
		btnSourceFolder = new Button(compositeSource, SWT.NONE);
		GridData gd_btnSourceFolder = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
		gd_btnSourceFolder.widthHint = 46;
		btnSourceFolder.setLayoutData(gd_btnSourceFolder);
		btnSourceFolder.setText("...");
		btnParse = new Button(shlUSBLogviewer, SWT.NONE);
		FormData fd_btnParse = new FormData();
		fd_btnParse.bottom = new FormAttachment(100,-10);
		fd_btnParse.right = new FormAttachment(btnClose, -6);
		btnParse.setLayoutData(fd_btnParse);
		btnParse.setText("Parse");

	}

	public void createTriggers() {
		
		btnClose.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				result = null;
				shlUSBLogviewer.dispose();
			}
		});

		table.addListener(SWT.DefaultSelection, new Listener() {
		      public void handleEvent(Event e) {
		        TableItem[] selection = table.getSelection();
		        String string = selection[0].getText(0);
		        result = string;
		        shlUSBLogviewer.dispose();
		      }
		    });

		btnSourceFolder.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				DirectoryDialog dlg = new DirectoryDialog(shlUSBLogviewer);

		        // Set the initial filter path according
		        // to anything they've selected or typed in
		        dlg.setFilterPath(textSinFolder.getText());

		        // Change the title bar text
		        dlg.setText("Directory chooser");

		        // Customizable message displayed in the dialog
		        dlg.setMessage("Select a directory");

		        // Calling open() will open and run the dialog.
		        // It will return the selected directory, or
		        // null if user cancels
		        String dir = dlg.open();
		        if (dir != null) {
		          // Set the text box to the new selection
		        	if (!textSinFolder.getText().equals(dir)) {
		        		textSinFolder.setText(dir);
		        		tableViewer.setInput(new Vector());
		        		tableViewer.refresh();
		        		lblSavedPath.setText("");
		        	}
		        }
			}
		});

		btnLogFile.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				FileDialog dlg = new FileDialog(shlUSBLogviewer);

		        // Set the initial filter path according
		        // to anything they've selected or typed in
		        dlg.setFilterPath(textLogFile.getText());

		        // Change the title bar text
		        dlg.setText("TMS File chooser");

		        dlg.setFilterExtensions(new String[] {"*.tms"});

		        // Calling open() will open and run the dialog.
		        // It will return the selected directory, or
		        // null if user cancels
		        String dir = dlg.open();
		        if (dir != null) {
		          // Set the text box to the new selection
		        	if (!textLogFile.getText().equals(dir)) {
		        		textLogFile.setText(dir);
		        		String filename = new File(dir).getName();
		        		textSinFolder.setText(new File(dir).getParentFile().getAbsolutePath()+File.separator+filename.substring(0, filename.indexOf("."))+"_decrypted");
		        		lblSavedPath.setText("");
		        		tableViewer.setInput(new Vector());
		        		tableViewer.refresh();
		        	}
		        }
			}
		});

		btnParse.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				WaitForUSBParser parse = new WaitForUSBParser(shlUSBLogviewer,SWT.PRIMARY_MODAL | SWT.SHEET);
				Session sess = (Session)parse.open(textLogFile.getText(),textSinFolder.getText());	
				lblSavedPath.setText("Script saved to "+sess.saveScript());
						
				Display.getDefault().asyncExec(
						new Runnable() {
							public void run() {
								tableViewer.setInput(sess.getScript());
							    for (int nbcols=0;nbcols<table.getColumnCount();nbcols++)
							    	table.getColumn(nbcols).pack();
							    tableViewer.refresh();
							}
						}
				);
			}
		});

	}
}
