/*******************************************************************************
 * 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.services.ui.wizards;

import java.util.ArrayList;

import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ptp.services.core.IService;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.IServiceProvider;
import org.eclipse.ptp.services.core.IServiceProviderDescriptor;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.ptp.services.ui.IServiceProviderContributor;
import org.eclipse.ptp.services.ui.ServiceModelUIManager;
import org.eclipse.ptp.services.ui.messages.Messages;
import org.eclipse.swt.SWT;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

/**
 * Wizard page used by {@link #ServiceConfigurationWizard} to select a service provider for 
 * a particular service.
 * 
 * NOT CURRENTLY USED AND MAY BE DEPRECATED
 *
 */
public class ServiceConfigurationWizardPage extends WizardPage {

	private final IService fService;
	private IWizard fChildWizard = null;

	private ArrayList<IServiceProviderDescriptor> fProviderComboList = new ArrayList<IServiceProviderDescriptor>();
	
	/**
	 * @param fWizard
	 * @param pageName
	 */
	public ServiceConfigurationWizardPage(IService service, String pageName) {
		super(pageName);
		fService = service;
		setPageComplete(false);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);

        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        container.setLayout(layout);
        setControl(container);
        
        Label providerLabel = new Label(container, SWT.LEFT);
        providerLabel.setText(Messages.ServiceConfigurationWizardPage_0);
        
        final Combo providerCombo = new Combo(container, SWT.DROP_DOWN | SWT.READ_ONLY);
        providerCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        providerCombo.addSelectionListener(new SelectionListener() {

			/* (non-Javadoc)
			 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
			 */
			public void widgetDefaultSelected(SelectionEvent e) {
				widgetSelected(e);
			}

			/* (non-Javadoc)
			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
			 */
			public void widgetSelected(SelectionEvent e) {
				handleComboSelection(providerCombo);
			}
        });

        createComboContents(providerCombo);
	}
	
	/**
     * The <code>WizardSelectionPage</code> implementation of 
     * this <code>IWizardPage</code> method returns the first page 
     * of the currently selected wizard if there is one.
     */
    public IWizardPage getNextPage() {
    	if (fChildWizard != null) {
    		return fChildWizard.getStartingPage();
    	}
    	return super.getNextPage();
    }

	/**
	 * @param combo
	 */
	private void handleComboSelection(Combo combo) {
		int index = combo.getSelectionIndex();
		IServiceProvider provider = ServiceModelManager.getInstance().getServiceProvider(fProviderComboList.get(index));
		IServiceConfiguration config = ((ServiceConfigurationWizard)getWizard()).getServiceConfiguration();
		config.setServiceProvider(getService(), provider);
		fChildWizard = null; // need to set fChildWizard to null so we get the next service configuration page
		if (!provider.isConfigured()) {
			IWizardPage page = getNextPage();
			IServiceProviderContributor contrib = ServiceModelUIManager.getInstance().getServiceProviderContributor(provider);
			if (contrib != null) {
				fChildWizard = contrib.getWizard(provider, page);
			}
		}
		setPageComplete(true);
	}
	
	/**
	 * @param combo
	 */
	protected void createComboContents(Combo combo) {
		IServiceConfiguration config = ((ServiceConfigurationWizard)getWizard()).getServiceConfiguration();
		IServiceProvider provider = config.getServiceProvider(getService());
		int index = 0;
		int selection = 0;
		combo.removeAll();
		for (IServiceProviderDescriptor descriptor : getService().getProvidersByPriority()) {
			combo.add(descriptor.getName());
			fProviderComboList.add(index, descriptor);
			if (descriptor.getId().equals(provider.getId())) {
				selection = index;
			}
			index++;
		}
		combo.select(selection);
		handleComboSelection(combo);
	}
	
    /**
	 * @return
	 */
	protected IService getService() {
		return fService;
	}
}
