/*******************************************************************************
 * Copyright (c) 2000, 2013 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.debug.internal.ui.launchConfigurations;

 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.debug.internal.core.IConfigurationElementConstants;
import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;


/**
 * Proxy to a launch configuration tab group element
 */
public class LaunchConfigurationTabGroupExtension {
	
	/**
	 * The configuration element defining this tab group.
	 */
	private IConfigurationElement fConfig = null;
	
	/**
	 * A list of sets of modes that this tab group supports
	 * @since 3.3
	 */
	private List<Set<String>> fModes = null;
	
	/**
	 * A map of mode sets to descriptions
	 * @since 3.3
	 */
	private Map<Set<String>, String> fDescriptions = null;
	
	/**
	 * Perspectives for each mode
	 */
	private Map<Set<String>, String> fPerspectives = null;
		
	/**
	 * Constructs a launch configuration tab extension based
	 * on the given configuration element
	 * 
	 * @param element the configuration element defining the
	 *  attributes of this launch configuration tab extension
	 * @return a new launch configuration tab extension
	 */
	public LaunchConfigurationTabGroupExtension(IConfigurationElement element) {
		setConfigurationElement(element);
	}
	
	/**
	 * Sets the configuration element that defines the attributes
	 * for this launch configuration tab group extension.
	 * 
	 * @param element configuration element
	 */
	private void setConfigurationElement(IConfigurationElement element) {
		fConfig = element;
	}
	
	/**
	 * Returns the configuration element that defines the attributes
	 * for this launch configuration tab group extension.
	 * 
	 * @param configuration element that defines the attributes
	 *  for this launch configuration tab extension
	 */
	protected IConfigurationElement getConfigurationElement() {
		return fConfig;
	}
	
	/**
	 * Returns the set of modes specified in the configuration data, or <code>null</code>
	 * if none (i.e. default tab group)
	 * 
	 * @return the set of modes specified in the configuration data, or
	 *  <code>null</code>
	 */
	protected List<Set<String>> getModes() {
		if (fModes == null) {
			fModes = new ArrayList<Set<String>>();
			fPerspectives = new Hashtable<Set<String>, String>();
			IConfigurationElement[] modes = fConfig.getChildren(IConfigurationElementConstants.LAUNCH_MODE);
			if (modes.length > 0) {
				IConfigurationElement element = null;
				String perspective = null, mode = null;
				Set<String> mset = null;
				for (int i = 0; i < modes.length; i++) {
					element = modes[i];
					mode = element.getAttribute(IConfigurationElementConstants.MODE);
					mset = new HashSet<String>();
					mset.add(mode);
					fModes.add(mset);
					perspective = element.getAttribute(IConfigurationElementConstants.PERSPECTIVE);
					if (perspective != null) {
						fPerspectives.put(mset, perspective);
					}
				}
			}
		}
		return fModes;
	}
	
	/**
	 * Returns the perspective associated with the given launch
	 * mode, as specified in plug-in XML, or <code>null</code> if none.
	 * 
	 * @param modes the set of launch modes
	 * @return perspective identifier, or <code>null</code>
	 */
	protected String getPerspective(Set<String> modes) {
		getModes();
		return fPerspectives.get(modes);
	}
	
	/**
	 * Returns the identifier of the type of launch configuration this
	 * tab group is associated with
	 * 
	 * @return the identifier of the type of launch configuration this
	 *  tab group is associated with
	 */	
	protected String getTypeIdentifier() {
		return getConfigurationElement().getAttribute(IConfigurationElementConstants.TYPE);
	}
	
	/**
	 * Returns the identifier of the help context associated with this tab
	 * group, or <code>null</code> if one was not specified.
	 * 
	 * @return the identifier of this tab group's help context or
	 * <code>null</code>
	 * @since 2.1
	 */	
	protected String getHelpContextId() {
		return getConfigurationElement().getAttribute(IConfigurationElementConstants.HELP_CONTEXT_ID);		
	}
	
	/**
	 * Returns the identifier of the tab group
	 * @return the id of the tab group
	 * 
	 * @since 3.3
	 */
	protected String getIdentifier() {
		return getConfigurationElement().getAttribute(IConfigurationElementConstants.ID); 
	}
	
	/**
	 * Returns a new tab group defined by this extension
	 * 
	 * @return a new tab group defined by this extension
	 * @exception CoreException if an exception occurs instantiating
	 * 	the tab group
	 */
	public ILaunchConfigurationTabGroup newTabGroup() throws CoreException {
		return (ILaunchConfigurationTabGroup)getConfigurationElement().createExecutableExtension(IConfigurationElementConstants.CLASS); 
	}

	/**
	 * Returns this tab group's description in the given mode set.
	 *
	 * @param modes the set of modes
	 * @return a description of the Launch Mode if available. If not available, attempts to return
	 * a description of the Launch Configuration. If no appropriate description is found an empty string is returned.
	 */
	public String getDescription(Set<String> modes) {
		String description = null;
		if(fDescriptions == null) {
			fDescriptions = new HashMap<Set<String>, String>();
			IConfigurationElement[] children = fConfig.getChildren(IConfigurationElementConstants.LAUNCH_MODE);
			IConfigurationElement child = null;
			String mode = null;
			HashSet<String> set = null;
			for (int i = 0; i < children.length; i++) {
				child = children[i];
				mode = child.getAttribute(IConfigurationElementConstants.MODE);
				if(mode != null) {
					set = new HashSet<String>();
					set.add(mode);
				}
				description = child.getAttribute(IConfigurationElementConstants.DESCRIPTION);
				if(description != null) {
					fDescriptions.put(set, description);
				}
			}
			
		} 
		description = fDescriptions.get(modes);
		if(description == null) {
			description = fConfig.getAttribute(IConfigurationElementConstants.DESCRIPTION);
			
		}
		return (description == null ? IInternalDebugCoreConstants.EMPTY_STRING : description);
	}
	
}

