package org.eclipse.ptp.services.ui.wizards;

import java.io.File;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.IServiceModelManager;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.ptp.services.ui.messages.Messages;
import org.eclipse.ptp.services.ui.widgets.ServiceConfigurationSelectionWidget;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;

public class ServiceConfigurationImportWizard extends Wizard implements IImportWizard {
	private class SelectFilePage extends WizardPage {

		private String file = ""; //$NON-NLS-1$
		private Combo fileCombo;
		private Button browseButton;
		private ServiceConfigurationSelectionWidget fServiceWidget;
		private int messageType = NONE;

		public SelectFilePage(String pageName, String title, ImageDescriptor titleImage) {
			super(pageName, title, titleImage);
			setDescription(Messages.ServiceConfigurationImportWizard_1); 
		}

		public void createControl(Composite parent) {
			Composite workArea = new Composite(parent, SWT.NONE);
			setControl(workArea);

	        workArea.setFont(parent.getFont());
	        workArea.setLayout(new GridLayout());
			workArea.setLayoutData(new GridData(GridData.FILL_BOTH
					| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));

			createFileSelectionArea(workArea);
			createConfigurationsArea(workArea);
			
			updateEnablement();
			Dialog.applyDialogFont(parent);
			messageType = ERROR;
		}
		
		private void createFileSelectionArea(Composite workArea) {
			Composite composite = new Composite(workArea, SWT.NULL);
	        composite.setLayout(new GridLayout());
	        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
			GridLayout layout = new GridLayout();
			layout.numColumns = 3;
			layout.marginHeight = 0;
			layout.marginWidth = 0;
			composite.setLayout(layout);
			
			Label label = new Label(composite, SWT.NONE);
			label.setText(Messages.ServiceConfigurationImportWizard_2);

			fileCombo = new Combo(composite, SWT.DROP_DOWN);
			GridData comboData = new GridData(GridData.FILL_HORIZONTAL);
			comboData.verticalAlignment = GridData.CENTER;
			comboData.grabExcessVerticalSpace = false;
			comboData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
			fileCombo.setLayoutData(comboData);
			file = FilenameStore.getSuggestedDefault();
			fileCombo.setItems(FilenameStore.getHistory());
			fileCombo.setText(file);
			fileCombo.addListener(SWT.Modify, new Listener() {
				public void handleEvent(Event event) {
					file = fileCombo.getText();				
					updateEnablement();
				}
			});

			browseButton = new Button(composite, SWT.PUSH);
			browseButton.setText(Messages.ServiceConfigurationImportWizard_3); 
			GridData data = new GridData();
			data.horizontalAlignment = GridData.FILL;
			int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
			data.widthHint = Math.max(widthHint, browseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
			browseButton.setLayoutData(data);
			browseButton.addListener(SWT.Selection, new Listener() {
				public void handleEvent(Event event) {
					FileDialog d = new FileDialog(getShell(), SWT.OPEN);
					d.setFilterExtensions(new String[] {"*.cfg", "*"}); //$NON-NLS-1$ //$NON-NLS-2$
					d.setFilterNames(new String[] {Messages.ServiceConfigurationImportWizard_4, Messages.ServiceConfigurationImportWizard_5});
					String fileName= getFileName();
					if (fileName != null && fileName.length() > 0) {
						int separator = fileName.lastIndexOf(System.getProperty("file.separator").charAt(0)); //$NON-NLS-1$
						if (separator != -1) {
							fileName= fileName.substring(0, separator);
						}
					} else {
						fileName= ResourcesPlugin.getWorkspace().getRoot().getLocation().toString();
					}
					d.setFilterPath(fileName);
					String f = d.open();
					if (f != null) {
						fileCombo.setText(f);
						file = f;
						updateConfigurations(file);
					}
				}
			});
		}
		
		private void updateConfigurations(String file) {
			try {
				final String filename = file;
				getContainer().run(true, true, new IRunnableWithProgress() {
					public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
						monitor.beginTask(Messages.ServiceConfigurationImportWizard_0, 100);
						fServiceConfigurations = fModelManager.importConfigurations(filename);
						monitor.worked(100);
						monitor.done();
					}
				});
			} catch (InvocationTargetException e) {
			} catch (InterruptedException e) {
				// Do nothing
			}
			
			fServiceWidget.setConfigurations(fServiceConfigurations);
			fServiceWidget.setAllChecked(true);
		}
		
		private void createConfigurationsArea(Composite workArea) {
			Composite composite = new Composite(workArea, SWT.NONE);
			composite.setLayout(new GridLayout());
			composite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
					| GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
			
			Label label = new Label(composite, SWT.NONE);
			label.setText(Messages.ServiceConfigurationImportWizard_12);
			
			fServiceWidget = new ServiceConfigurationSelectionWidget(composite, SWT.CHECK, null, null, true);
			fServiceWidget.setConfigurations(new IServiceConfiguration[0]);
		}
		
		public String getFileName() {
			return file;
		}
		
		public IServiceConfiguration[] getServiceConfigurations() {
			return fServiceWidget.getCheckedServiceConfigurations();
		}
		
		private void updateEnablement() {
			boolean complete = false;
			setMessage(null);
			
			if (file.length() == 0) {
				setMessage(Messages.ServiceConfigurationImportWizard_6, messageType);
				setPageComplete(false);
				return;
			} else {
				// See if the file exists
				File f = new File(file);
				if (!f.exists()) {
					setMessage(Messages.ServiceConfigurationImportWizard_7, messageType); 
					setPageComplete(false);
					return;
				} else if (f.isDirectory()) {
					setMessage(Messages.ServiceConfigurationImportWizard_8, messageType); 
					setPageComplete(false);
					return;
				} else if (!fModelManager.isValidConfigurationFile(file)) {
					setMessage(Messages.ServiceConfigurationImportWizard_13, messageType);
					setPageComplete(false);
					return;
				}
				complete = true;
			}
			
			if (complete) {
				setErrorMessage(null);
				setDescription(Messages.ServiceConfigurationImportWizard_9);
			}
				
			setPageComplete(complete);
		}
		
		public void setVisible(boolean visible) {
			super.setVisible(visible);
			if (visible) {
				fileCombo.setFocus();
			}
		}
	}
	
	private SelectFilePage mainPage;
	private IServiceConfiguration[] fServiceConfigurations;
	private IServiceModelManager fModelManager = ServiceModelManager.getInstance();
	
	public ServiceConfigurationImportWizard() {
		setNeedsProgressMonitor(true);
		setWindowTitle(Messages.ServiceConfigurationImportWizard_10); 
	}
	
	public void addPages() {
		mainPage = new SelectFilePage("importMainPage", Messages.ServiceConfigurationImportWizard_11, null); //$NON-NLS-1$ 
		addPage(mainPage);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
	 */
	@Override
	public boolean performFinish() {
		for (IServiceConfiguration config : mainPage.getServiceConfigurations()) {
			fModelManager.addConfiguration(config);
		}
		return true;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
	 */
	public void init(IWorkbench workbench, IStructuredSelection selection) {
		FilenameStore.setDefaultFromSelection(workbench);
	}

}
