/*******************************************************************************
 * Copyright (c) 2009 IBM Corporation and others.
 * 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:
 *    IBM Corporation - initial API and implementation
 *******************************************************************************/ 
package org.eclipse.ptp.rdt.ui.wizards;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ptp.rdt.ui.messages.Messages;
import org.eclipse.ptp.rdt.ui.serviceproviders.RemoteCIndexServiceProvider;
import org.eclipse.ptp.services.core.IServiceProvider;
import org.eclipse.ptp.services.ui.IServiceProviderContributor;
import org.eclipse.rse.connectorservice.dstore.DStoreConnectorService;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.model.SystemStartHere;
import org.eclipse.rse.core.subsystems.IConnectorService;
import org.eclipse.rse.ui.wizards.newconnection.RSEDefaultNewConnectionWizard;
import org.eclipse.rse.ui.wizards.newconnection.RSEMainNewConnectionWizard;
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.Group;
import org.eclipse.swt.widgets.Label;


public class RemoteCIndexServiceProviderContributer implements IServiceProviderContributor {

	private RemoteCIndexServiceProvider provider;
	
	private Map<Integer, IHost> hostComboIndexToHostMap = new HashMap<Integer, IHost>();
	
	private IHost selectedHost;
	private String configPath;
	
	
	public void configureServiceProvider(IServiceProvider sp, final Composite container) {
		if(!(sp instanceof RemoteCIndexServiceProvider))
			throw new IllegalArgumentException(); // should never happen
		
		this.provider = (RemoteCIndexServiceProvider) sp;

		container.setLayout(new GridLayout(1, false));
		
		Group connectionGroup = new Group(container, SWT.NONE);
		connectionGroup.setText("Connection"); //$NON-NLS-1$
		connectionGroup.setLayout(new GridLayout(1, false));
		connectionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		
		// Label for "Host:"
        Label hostLabel = new Label(connectionGroup, SWT.LEFT);
        hostLabel.setLayoutData(new GridData());
        hostLabel.setText(Messages.getString("HostSelectionDialog_0")); //$NON-NLS-1$
        
        // combo for hosts
        final Combo hostCombo = new Combo(connectionGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
        hostCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); // set layout to grab horizontal space
        
        //attempt to restore settings from saved state
        IHost hostSelected = provider.getHost();
        
        // populate the combo with a list of hosts
        IHost[] hosts = SystemStartHere.getConnections();
        int toSelect = 0;
        
        for(int k = 0; k < hosts.length; k++) {
        	hostCombo.add(hosts[k].getAliasName(), k);
        	hostComboIndexToHostMap.put(k, hosts[k]);
        	
        	if (hostSelected != null && hostSelected.getAliasName().compareTo(hosts[k].getAliasName()) == 0) {
        		toSelect = k;
        	}
        }
        
        // set selected host to be the first one if we're not restoring from settings
        hostCombo.select(toSelect);
        selectedHost = hostComboIndexToHostMap.get(toSelect);
        
        // button for creating new connections
        Button newConnectionButton = new Button(connectionGroup, SWT.PUSH);
        newConnectionButton.setLayoutData(new GridData());
        newConnectionButton.setText(Messages.getString("HostSelectionDialog.0")); //$NON-NLS-1$
        newConnectionButton.addSelectionListener(new SelectionAdapter() {

			public void widgetSelected(SelectionEvent e) {
				// launch the RSE New Connection Wizard
				RSEMainNewConnectionWizard wizard = new RSEMainNewConnectionWizard();
				WizardDialog wizardDialog = new WizardDialog(container.getShell(), wizard);
				wizardDialog.open();
				
				IWizard actualWizard = wizard.getSelectedWizard();
				if(actualWizard instanceof RSEDefaultNewConnectionWizard) {
					// get the new host, if any
					IHost host = ((RSEDefaultNewConnectionWizard)actualWizard).getCreatedHost();
					
					// add the host
					int index = hostCombo.getItemCount() - 1;
					hostCombo.add(host.getAliasName(), index);
		        	hostComboIndexToHostMap.put(index, host);
		        	
		        	// select the new host
		        	hostCombo.select(index);
		            selectedHost = host;
		            updateProvider();
				}
			}
        	
        });
        
        configPath = provider.getIndexLocation();
        if(provider.isConfigured() && configPath == null) // happens if the project was created before the index location feature was added
        	configPath = ""; //$NON-NLS-1$
      
        final IndexFileLocationWidget scopeWidget = new IndexFileLocationWidget(container, SWT.NONE, selectedHost, configPath);
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
        data.horizontalSpan = 3;
        scopeWidget.setLayoutData(data); // set layout to grab horizontal space
        scopeWidget.addPathListener(new IIndexFilePathChangeListener() {
			public void pathChanged(String newPath) {
				configPath = newPath;
				updateProvider();
			}
		});
        
        
        hostCombo.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
				widgetSelected(e);
			}

			public void widgetSelected(SelectionEvent e) {
				int selectionIndex = hostCombo.getSelectionIndex();
				selectedHost = hostComboIndexToHostMap.get(selectionIndex);
				scopeWidget.setHost(selectedHost);
				updateProvider();
			}
        });
        
        updateProvider();
	}
	

	private void updateProvider() {
		// set the host for the service provider
		provider.setConnection(selectedHost, getDStoreConnectorService(selectedHost));
		provider.setIndexLocation(configPath);
		provider.setConfigured(true);
	}
	
	private IConnectorService getDStoreConnectorService(IHost host) {
		for(IConnectorService cs : host.getConnectorServices()) {
			if(cs instanceof DStoreConnectorService)
				return cs;
		}
		return null;
	}
	
	
	public IWizard getWizard(IServiceProvider provider, IWizardPage page) {
		// TODO Auto-generated method stub
		return null;
	}

	public WizardPage[] getWizardPages(IWizard wizard, IServiceProvider provider) {
		// TODO Auto-generated method stub
		return null;
	}

}
