package com.quantum.wizards;

import com.quantum.Messages;
import com.quantum.QuantumPlugin;
import com.quantum.adapters.AdapterFactory;
import com.quantum.adapters.DriverInfo;
import com.quantum.model.Bookmark;
import com.quantum.model.BookmarkCollection;
import com.quantum.view.bookmark.BookmarkNode;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

public class BookmarkWizard extends Wizard {
	BookmarkPage mainPage;

	private Bookmark current;

	public void init(BookmarkNode selection) {
		System.out.println("Initing workbench"); //$NON-NLS-1$
		this.current = selection.getBookmark();
		setWindowTitle(Messages.getString("BookmarkWizard.NewBookmark")); //$NON-NLS-1$
	}
	public void init() {
		System.out.println("Initing workbench"); //$NON-NLS-1$
		current = null;
		setWindowTitle(Messages.getString("BookmarkWizard.NewBookmark")); //$NON-NLS-1$
	}
	public boolean performFinish() {
		System.out.println("perform finish workbench"); //$NON-NLS-1$
		String bookmarkName = mainPage.name.getText();
		if ( BookmarkCollection.getInstance().find(bookmarkName) != null){
			MessageDialog.openInformation(
				this.getShell(),Messages.getString("BookmarkWizard.Error"),Messages.getString("BookmarkWizard.bookmarkAlreadyExists"));	 //$NON-NLS-1$ //$NON-NLS-2$
		  		return false;
		}

		mainPage.performFinish();
		return true;
	}
	public void addPages() {
		System.out.println("adding pages"); //$NON-NLS-1$
		if (current != null) {
			mainPage = new BookmarkPage(Messages.getString("BookmarkWizard.Testing"), current); //$NON-NLS-1$
		} else {
			mainPage = new BookmarkPage(Messages.getString("BookmarkWizard.Testing")); //$NON-NLS-1$
		}
		addPage(mainPage);
		System.out.println("adding pages"); //$NON-NLS-1$
	}
}

class BookmarkPage extends WizardPage {
	public static final String ADD = "ADD"; //$NON-NLS-1$
	String action = ADD;
	Text name;
	Text username;
	Text password;
	Text schema;
	Text connect;
	Text driver;
	//List driverList;
	Combo type;
	Text driverFile;
    Button prompt;

	Bookmark initialData = null;

	FileDialog dialog;

	DriverInfo[] drivers = AdapterFactory.getInstance().getDriverList();
	/**
	 * Constructor for BookmarkPage.
	 * @param pageName
	 */
	public BookmarkPage(String pageName) {
		super(pageName);
		initialData = null;
	}
	/**
	 * Constructor for BookmarkPage.
	 * @param pageName
	 */
	public BookmarkPage(String pageName, Bookmark bookmark) {
		super(pageName);
		this.initialData = bookmark;
	}

	public void createControl(Composite parent) {
		System.out.println("page create control"); //$NON-NLS-1$
		dialog = new FileDialog(getContainer().getShell(), SWT.OPEN);
		dialog.setFilterExtensions(new String[]{"*.jar", "*.zip","*.*"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		dialog.setFilterNames(new String[]{Messages.getString("BookmarkWizard.JarFiles"),Messages.getString("BookmarkWizard.ZipFiles"), Messages.getString("BookmarkWizard.AllFiles")}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		Composite container = new Composite(parent, SWT.NULL);
		GridLayout layout = new GridLayout();
		container.setLayout(layout);
		layout.numColumns = 2;
		layout.verticalSpacing = 9;


		Label label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.BookmarkNameAst")); //$NON-NLS-1$
		name = new Text(container, SWT.BORDER | SWT.SINGLE);
 		GridData fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		name.setLayoutData(fullHorizontal);

		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.UsernameAst")); //$NON-NLS-1$
		username = new Text(container, SWT.BORDER | SWT.SINGLE);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		username.setLayoutData(fullHorizontal);

		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.PasswordAst")); //$NON-NLS-1$
		password = new Text(container, SWT.BORDER | SWT.SINGLE);
		password.setEchoChar('*');
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		password.setLayoutData(fullHorizontal);
 
        this.prompt = new Button(container, SWT.CHECK);
        this.prompt.setText(Messages.getString("BookmarkWizard.Prompt")); //$NON-NLS-1$
        fullHorizontal = new GridData();
        fullHorizontal.horizontalAlignment = GridData.FILL;
        fullHorizontal.horizontalSpan = 2;
        this.prompt.setLayoutData(fullHorizontal);
 
		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.Schema")); //$NON-NLS-1$
		schema = new Text(container, SWT.BORDER | SWT.SINGLE);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		schema.setLayoutData(fullHorizontal);

		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.ConnectAst")); //$NON-NLS-1$
		connect = new Text(container, SWT.BORDER | SWT.SINGLE);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		connect.setLayoutData(fullHorizontal);

		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.DriverAst")); //$NON-NLS-1$
		driver = new Text(container, SWT.BORDER | SWT.SINGLE);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		driver.setLayoutData(fullHorizontal);

		//label = new Label(container, SWT.NULL);
 		//fullHorizontal = new GridData();
 		//fullHorizontal.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING;
		//fullHorizontal.verticalSpan = 3;
		//label.setLayoutData(fullHorizontal);
		//label.setText("(Drivers Found in File)");
		/*driverList = new List(container, SWT.SINGLE);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		fullHorizontal.verticalAlignment = GridData.FILL;
		fullHorizontal.verticalSpan = 3;
		driverList.setLayoutData(fullHorizontal);
		driverList.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				String[] selection = driverList.getSelection();
				if (selection != null && selection.length > 0) {
					driver.setText(selection[0]);
				}
			}
		});*/

		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.TypeAst")); //$NON-NLS-1$
		type = new Combo(container, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY);
		String driverNames[] = new String[drivers.length];
		for (int i = 0; i < drivers.length; i++) {
			driverNames[i] = drivers[i].getDisplayName();
		}
		type.setItems(driverNames);
		type.select(0);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		type.setLayoutData(fullHorizontal);

		label = new Label(container, SWT.NULL);
		label.setText(Messages.getString("BookmarkWizard.DriverFilenameAst")); //$NON-NLS-1$
		driverFile = new Text(container, SWT.BORDER | SWT.SINGLE);
 		fullHorizontal = new GridData();
		fullHorizontal.horizontalAlignment = GridData.FILL;
		driverFile.setLayoutData(fullHorizontal);

		Button button = new Button(container, SWT.PUSH);
		button.setText(Messages.getString("BookmarkWizard.Browse")); //$NON-NLS-1$
		
		button.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				// We retrieve the last saved path
				dialog.setFilterPath(QuantumPlugin.getDefault().getPreferenceStore().getString("quantum.dialogs.bookmarkwizard.path")); //$NON-NLS-1$
				String filename = dialog.open();
				if (filename != null) {
					driverFile.setText(filename);
				//	We save the used path
					 QuantumPlugin.getDefault().getPreferenceStore().setValue("quantum.dialogs.bookmarkwizard.path", filename); //$NON-NLS-1$
		
				}
			}
		});

//		if (initialData != null) {
//			name.setText(initialData.getName());
//			username.setText(initialData.getUsername());
//            if (initialData.getPromptForPassword()) {
//                this.password.setEditable(false);
//            } else {
//                password.setText(initialData.getPassword());
//            }
//			connect.setText(initialData.getConnect());
//			driver.setText(initialData.getDriver());
//			String typeData = initialData.getType();
//            this.prompt.setSelection(initialData.getPromptForPassword());
//			int selectedIndex = 0;
//			for (int i = 0; i < drivers.length; i++) {
//				if (typeData.equals(drivers[i].getDriverType())) {
//					selectedIndex = i;
//				}
//			}
//			type.select(selectedIndex);
//			driverFile.setText(initialData.getDriverFile());
//			updateDriverList();
//		}

        prompt.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                BookmarkPage.this.password.setEditable(!prompt.getSelection());
            }
        });

		setControl(container);

		setPageComplete(true);
	}
	public void updateDriverList() {
			/*try {
				JarFile file = new JarFile(driverFile.getText());
				Enumeration enum = file.entries();
				while (enum.hasMoreElements()) {
					JarEntry entry = (JarEntry) enum.nextElement();
					String className = entry.getName().replace('/', '.');
					if (className.endsWith("Driver.class")) {
						className = className.substring(0, className.lastIndexOf('.'));
						//driverList.add(className);
					}
				}
			} catch (IOException ex) {
				//driverList.removeAll();
			}*/
	}
	public void performFinish() {
		if (initialData == null) {
			initialData = new Bookmark();
		}
		initialData.setName(name.getText());
		initialData.setUsername(username.getText());
        initialData.setPromptForPassword(this.prompt.getSelection());
        if (initialData.getPromptForPassword()) {
            initialData.setPassword(""); //$NON-NLS-1$
        } else {
    		initialData.setPassword(password.getText());
        }
		initialData.addSchema(schema.getText());
		initialData.setConnect(connect.getText());
		initialData.setDriver(driver.getText());
		int selection = type.getSelectionIndex();
		if (selection >= 0) {
			initialData.setType(drivers[selection].getDriverType());
		}
		initialData.setDriverFile(driverFile.getText());
        BookmarkCollection.getInstance().addBookmark(initialData);
	}
}