/*******************************************************************************
 * Copyright (c) 2012 University of Illinois 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: 
 * 		Chris Navarro (Illinois/NCSA) - Design and implementation
 *******************************************************************************/
package org.eclipse.ptp.internal.etfw.launch;

import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.ptp.internal.etfw.launch.ui.util.ETFWToolTabBuilder;
import org.eclipse.ptp.internal.rm.jaxb.control.ui.launch.IJAXBLaunchConfigurationTab;
import org.eclipse.ptp.launch.ui.extensions.JAXBControllerLaunchConfigurationTab;
import org.eclipse.ptp.launch.ui.extensions.RMLaunchValidation;
import org.eclipse.ptp.rm.jaxb.control.core.ILaunchController;
import org.eclipse.ptp.rm.jaxb.control.ui.IUpdateModel;
import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
import org.eclipse.ptp.rm.jaxb.core.data.AttributeType;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

/**
 * Extends JAXBControllerLaunchConfigurationTab with specific changes for ETFw. The LC Map needs to be initialized from the
 * workflow's variable map, not the resource managers.
 * 
 * @author Chris Navarro
 * 
 */
public class ETFWParentLaunchConfigurationTab extends JAXBControllerLaunchConfigurationTab {
	private final IVariableMap variableMap;
	private List<IJAXBLaunchConfigurationTab> tabControllers;

	public ETFWParentLaunchConfigurationTab(ILaunchController control, ILaunchConfigurationDialog dialog, IProgressMonitor monitor,
			IVariableMap variableMap) throws Throwable {
		super(control, dialog, monitor);
		this.variableMap = variableMap;
	}

	@Override
	public void createControl(Composite parent, String id) throws CoreException {
		control = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		control.setLayout(layout);

		tabFolder = new TabFolder(control, SWT.NONE);
		tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		ETFWToolTabBuilder.initialize();
		for (IJAXBLaunchConfigurationTab tabControl : tabControllers) {
			ETFWToolTabBuilder builder = new ETFWToolTabBuilder(tabControl, this.variableMap);

			TabItem tabItem = new TabItem(tabFolder, SWT.NONE);
			Control control = null;
			final ScrolledComposite scroller = new ScrolledComposite(tabFolder, SWT.V_SCROLL | SWT.H_SCROLL);
			try {
				control = builder.build(scroller);
				((Composite) control).layout();

				tabItem.setText(tabControl.getController().getTitle());
				String tooltip = tabControl.getController().getTooltip();
				if (tooltip != null) {
					tabItem.setToolTipText(tooltip);
					scroller.setToolTipText(tooltip);
				}

				scroller.setContent(control);
				scroller.setExpandHorizontal(true);
				scroller.setExpandVertical(true);
				scroller.setMinSize(control.computeSize(SWT.DEFAULT, SWT.DEFAULT));

				tabItem.setControl(scroller);
			} catch (Throwable t) {
				t.printStackTrace();
			}

		}
		this.controlId = id;
		control.layout(true, true);
	}

	@Override
	public RMLaunchValidation initializeFrom(ILaunchConfiguration configuration) {
		try {
			// This lets us differentiate keys from the old ETFW so they can work from one Profiling Tab
			getVariableMap().initialize(variableMap, getJobControl().getControlId());
			getUpdateHandler().clear();
			getVariableMap().updateFromConfiguration(configuration);
		} catch (Throwable t) {
			t.printStackTrace();
		}

		return null;
	}

	public void addDynamicContent(List<IJAXBLaunchConfigurationTab> tabs) {
		this.tabControllers = tabs;
	}

	@Override
	public RMLaunchValidation performApply(ILaunchConfigurationWorkingCopy configuration) {
		RMLaunchValidation validation = super.performApply(configuration);

		// TODO the above performApply should update the attribute map, but it doesn't right now so it is handled below
		Iterator<String> iterator = getVariableMap().getAttributes().keySet().iterator();
		while (iterator.hasNext()) {
			String attribute = iterator.next();
			String name = attribute;
			if (name.startsWith(controlId)) {
				name = name.substring(controlId.length() + 1, attribute.length());

				// Check to see if the variable is part of ETFw
				AttributeType temp = variableMap.getAttributes().get(name);
				if (temp != null) {
					if (isWidgetEnabled(temp.getName()) && temp.isVisible()) {
						String attType = temp.getType();

						// If boolean is translated to a string, insert the string into the launch configuration
						String translateBoolean = variableMap.getAttributes().get(name).getTranslateBooleanAs();
						Object value = getVariableMap().getValue(name);
						if (attType.equals("boolean")) { //$NON-NLS-1$
							if (translateBoolean != null) {
								configuration.setAttribute(attribute, value.toString());
							} else {
								boolean val = new Boolean(value.toString());
								configuration.setAttribute(attribute, val);
							}
						} else if (attType.equals("string")) { //$NON-NLS-1$
							configuration.setAttribute(attribute, value.toString());
						} else if (attType.equals("integer")) { //$NON-NLS-1$
							if (value.toString().length() > 0) {
								int val = new Integer(value.toString());
								configuration.setAttribute(attribute, val);
							} else {
								configuration.setAttribute(attribute, value.toString());
							}
						} else {
							configuration.setAttribute(attribute, value.toString());
						}
					}
				}
			}
		}

		return validation;
	}

	/**
	 * Determines if the UI widget is enabled and should be included in the launch configuration. It prevents attributes that are
	 * not enabled from getting included in the launch configuration
	 * 
	 * @param attributeName
	 *            Name of the attribute associated with the widget
	 * @return enabled state of widget
	 */
	public boolean isWidgetEnabled(String attributeName) {
		for (IJAXBLaunchConfigurationTab tabControl : tabControllers) {
			for (IUpdateModel m : tabControl.getLocalWidgets().values()) {
				if (m.getName() != null) {
					if (m.getName().equals(attributeName)) {
						return ((Control) m.getControl()).isEnabled();
					}
				} else {
					// Do nothing, the model has no attribute associated with it
				}
			}
		}
		// Handles the case where attributes are not associated with UI models
		return true;
	}

	@Override
	public void relink() {
		// Some of the jaxb classes need to be re-worked for this to be implemented because their are target configuration specifics
		// in this call hierarchy
	}

}
