/*******************************************************************************
 * Copyright (c) 2017 CEA LIST.
 *
 * 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:
 *  Alain Faivre (CEA LIST) alain.faivre@cea.fr - Initial Implementation (tab-based, inserted in Run Configurations dialog)
 *  Erwan Mahe (CEA LIST) erwan.mahe@cea.fr - New API (free-composite-based, no type assumptions on parent)
 *******************************************************************************/

package org.eclipse.efm.execution.configuration.common.ui.page.expert;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.efm.execution.configuration.common.ui.api.AbstractConfigurationPage;
import org.eclipse.efm.execution.configuration.common.ui.api.AbstractConfigurationProfile;
import org.eclipse.efm.execution.configuration.common.ui.api.ILaunchConfigurationGUIelement;
import org.eclipse.efm.execution.configuration.common.ui.api.IWidgetToolkit;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;

public class ExpertConfigurationPage extends AbstractConfigurationPage {

	public Composite fCompositeStack;
	public StackLayout fStackLayout;

	private Group groupExplorationPage;

	// BEHAVIOR SELECTION : HIT OR JUMP
	ExpertBehaviorSelectionConfigurationProfile fBehaviorSelectionPage;

	// TRANSITION COVERAGE
	ExpertTransitionCoverageConfigurationProfile fTransitionCoveragePage;

	public ExpertConfigurationPage(ILaunchConfigurationGUIelement masterGUIelement) {
		super(masterGUIelement);
		// BEHAVIOR SELECTION : HIT OR JUMP
		fBehaviorSelectionPage = new ExpertBehaviorSelectionConfigurationProfile(this);

		//  TRANSITION COVERAGE
		fTransitionCoveragePage = new ExpertTransitionCoverageConfigurationProfile(this);
	}


	// ======================================================================================
	//                              Graphical Components Creation Methods
	// ======================================================================================

	@Override
	protected void createContent(Composite parent, IWidgetToolkit widgetToolkit)
	{
		// Stack Composite w.r.t. analysis profile
		fCompositeStack =  widgetToolkit.createComposite(parent, SWT.BORDER);
		fCompositeStack.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		fStackLayout = new StackLayout();
		fCompositeStack.setLayout(fStackLayout);

		// EXPLORATION PAGE
		createExplorationPage(fCompositeStack, widgetToolkit);
		
		fStackLayout.topControl = groupExplorationPage;
		fCompositeStack.layout();

		// BEHAVIOR SELECTION : HIT OR JUMP
		fBehaviorSelectionPage.createControl(fCompositeStack, widgetToolkit);

		// TRANSITION COVERAGE
		fTransitionCoveragePage.createControl(fCompositeStack, widgetToolkit);
	}

	private void setEnableGroupExplorationPage(ILaunchConfiguration configuration) {
		try {
			String modelAnalysisProfile = configuration.getAttribute(
					ATTR_SPECIFICATION_MODEL_ANALYSIS_PROFILE, "");

			setVisibleProfilePage( modelAnalysisProfile );
		}
		catch (CoreException e) {
			e.printStackTrace();
		}
	}
	
	public void setVisibleProfilePage(AbstractConfigurationProfile aProfilePage) {
		fStackLayout.topControl = aProfilePage.getSection();
		fCompositeStack.layout();
	}

	public void setVisibleProfilePage(String analysisProfile) {
		switch ( analysisProfile ) {
		case ANALYSIS_PROFILE_MODEL_COVERAGE_TRANSITION:
			setVisibleProfilePage( fTransitionCoveragePage );
			break;
		case ANALYSIS_PROFILE_MODEL_COVERAGE_BEHAVIOR:
			setVisibleProfilePage( fBehaviorSelectionPage );
			break;
			
		case ANALYSIS_PROFILE_MODEL_TEST_OFFLINE:
		case ANALYSIS_PROFILE_MODEL_EXPLORATION:
		default:
			fStackLayout.topControl = groupExplorationPage;
			fCompositeStack.layout();
			break;
		}
	}



	private void createExplorationPage(Composite parent, IWidgetToolkit widgetToolkit) {
		groupExplorationPage = widgetToolkit.createGroup(parent,
				"Exploration Page", 1, 2, GridData.FILL_HORIZONTAL);

        Composite comp = widgetToolkit.createComposite(groupExplorationPage, 1, 1,
        		GridData.FILL_HORIZONTAL);

        widgetToolkit.createLabel(comp, "&No expert mode for Exploration "
        		+ "of Model Analysis and Test Verdict Computation !", 1);
	}

	// ======================================================================================
	//                              Fields Values Management
	// ======================================================================================

	@Override
	public void setDefaultFieldValues(ILaunchConfigurationWorkingCopy configuration) {
		// BEHAVIOR SELECTION : HIT OR JUMP
		fBehaviorSelectionPage.setDefaults(configuration);

		// TRANSITION COVERAGE
		fTransitionCoveragePage.setDefaults(configuration);
	}


	@Override
	public void initializeFieldValuesFrom(ILaunchConfiguration configuration) {
		setEnableGroupExplorationPage(configuration);

		// BEHAVIOR SELECTION : HIT OR JUMP
		fBehaviorSelectionPage.initializeFrom(configuration);

		// TRANSITION COVERAGE
		fTransitionCoveragePage.initializeFrom(configuration);
	}


	@Override
	public void applyUpdatesOnFieldValuesFrom(ILaunchConfigurationWorkingCopy configuration) {
		// BEHAVIOR SELECTION : HIT OR JUMP
		fBehaviorSelectionPage.performApply(configuration);

		// TRANSITION COVERAGE
		fTransitionCoveragePage.performApply(configuration);
	}

	// ======================================================================================
	//                              Fields Validation
	// ======================================================================================

	@Override
	public FieldValidationReturn areFieldsValid(ILaunchConfiguration launchConfig) {
		// BEHAVIOR SELECTION : HIT OR JUMP
		if( ! fBehaviorSelectionPage.isValid(launchConfig) ) {
			return new FieldValidationReturn(false, null);
		}
		// TRANSITION COVERAGE
		if( ! fTransitionCoveragePage.isValid(launchConfig) ) {
			return new FieldValidationReturn(false, null);
		}
		return new FieldValidationReturn(true, null);
	}

	
	///////////////////////////////////////////////////////////////////////////
	// Model Analysis Profile changed
	//
	@Override
	public void handleModelAnalysisProfileSelectionChanged(String analysisProfile) {
		setVisibleProfilePage(analysisProfile);
	}


}
