/*=============================================================================#
 # Copyright (c) 2007, 2019 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.internal.redocs.tex.r.ui.processing;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;

import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingUI;
import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingUI.CommonFlags;
import org.eclipse.statet.docmlet.base.ui.processing.actions.RunDocConfigsMenuContribution;
import org.eclipse.statet.redocs.r.ui.RedocsRUI;


@NonNullByDefault
public class TexRweaveConfigsMenuContribution extends RunDocConfigsMenuContribution {
	
	
	private static final String PROCESS_TEX_COMMAND_ID= "org.eclipse.statet.docmlet.commands.ProcessTexDefault"; //$NON-NLS-1$
	
	
	private class ThisConfigContribution extends DocConfigContribution {
		
		
		public ThisConfigContribution(final String label, final Image icon,
				final ILaunchConfiguration configuration) {
			super(label, icon, configuration);
		}
		
		
		@Override
		protected void addLaunchItems(final Menu menu) {
			String buildDetail= null;
			String weaveDetail= null;
			String produceDetail= null;
			try {
				final ILaunchConfiguration config= getConfiguration();
				final IFile file= getElement();
				final String sourceInputExt= resolveFormatExt(TexRweaveConfig.SOURCE_FORMAT,
						file.getFileExtension() );
				final boolean weaveEnabled= config.getAttribute(TexRweaveConfig.WEAVE_ENABLED_ATTR_NAME, false);
				final String weaveInputExt= sourceInputExt;
				final String weaveOutputExt= resolveFormatExt(TexRweaveConfig.getFormat(
							TexRweaveConfig.WEAVE_OUTPUT_FORMATS, null,
							config.getAttribute(TexRweaveConfig.WEAVE_OUTPUT_FORMAT_ATTR_NAME, (String) null) ),
						weaveInputExt );
				final boolean produceEnabled= config.getAttribute(TexRweaveConfig.PRODUCE_ENABLED_ATTR_NAME, false);
				final String produceInputExt= (weaveEnabled) ? weaveOutputExt : sourceInputExt;
				final String produceOutputExt= resolveFormatExt(TexRweaveConfig.getFormat(
							TexRweaveConfig.PRODUCE_OUTPUT_FORMATS, null,
							config.getAttribute(TexRweaveConfig.PRODUCE_OUTPUT_FORMAT_ATTR_NAME, (String) null) ),
						produceInputExt );
				
				if (weaveEnabled | produceEnabled) {
					buildDetail= createDetail(
							(weaveEnabled) ? weaveInputExt : produceInputExt,
							(produceEnabled) ? produceOutputExt : weaveOutputExt );
				}
				weaveDetail= createDetail(weaveInputExt, weaveOutputExt);
				produceDetail= createDetail(produceInputExt, produceOutputExt);
			} catch (final CoreException e) {
			}
			
			addLaunchItem(menu, CommonFlags.PROCESS_AND_PREVIEW, null, true,
					DocProcessingUI.PROCESS_AND_PREVIEW_DOC_DEFAULT_COMMAND_ID,
					DocProcessingUI.ACTIONS_RUN_CONFIG_HELP_CONTEXT_ID );
			addLaunchItem(menu, CommonFlags.PROCESS, buildDetail, (buildDetail != null),
					DocProcessingUI.PROCESS_DOC_DEFAULT_COMMAND_ID,
					DocProcessingUI.ACTIONS_RUN_CONFIG_PROCESS_HELP_CONTEXT_ID );
			
			new MenuItem(menu, SWT.SEPARATOR);
			
			addLaunchItem(menu, CommonFlags.WEAVE, weaveDetail, (weaveDetail != null),
					RedocsRUI.PROCESS_WEAVE_DEFAULT_COMMAND_ID,
					DocProcessingUI.ACTIONS_RUN_CONFIG_STEP_HELP_CONTEXT_ID );
			addLaunchItem(menu, CommonFlags.PRODUCE_OUTPUT, produceDetail, (produceDetail != null),
					PROCESS_TEX_COMMAND_ID,
					DocProcessingUI.ACTIONS_RUN_CONFIG_STEP_HELP_CONTEXT_ID );
			addLaunchItem(menu, CommonFlags.OPEN_OUTPUT, null, true,
					DocProcessingUI.PREVIEW_DOC_DEFAULT_COMMAND_ID,
					DocProcessingUI.ACTIONS_RUN_CONFIG_PREVIEW_HELP_CONTEXT_ID );
		}
		
	}
	
	
	public TexRweaveConfigsMenuContribution() {
		super(); // use dynamically content type of editor
	}
	
	
	@Override
	protected ConfigContribution createConfigContribution(final StringBuilder label,
			final Image icon,
			final ILaunchConfiguration configuration) {
		return new ThisConfigContribution(label.toString(), icon, configuration);
	}
	
}
