/*=============================================================================#
 # Copyright (c) 2009, 2020 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.nico.core.util;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;

import org.eclipse.statet.nico.core.runtime.SubmitType;


public class TrackingConfiguration2LaunchConfiguration {
	
	public static final String LABEL_KEY = "label"; //$NON-NLS-1$
	public static final String TRACK_STREAM_INFO = "TrackInfo.enable"; //$NON-NLS-1$
	public static final String TRACK_STREAM_INPUT = "TrackInput.enable"; //$NON-NLS-1$
	public static final String TRACK_STREAM_INPUT_HISTORYONLY = "TrackInput.HistoryOnly.enable"; //$NON-NLS-1$
	public static final String TRACK_STREAM_OUTPUT = "TrackOutput.enable"; //$NON-NLS-1$
	public static final String TRACK_STREAM_OUTPUT_TRUNCATE = "TrackOutput.Truncate.enable"; //$NON-NLS-1$
	public static final String TRACK_STREAM_OUTPUT_TRUNCATE_LINES = "TrackOutput.Truncate.lines"; //$NON-NLS-1$
	public static final String SUBMIT_TYPES = "SubmitTypes.ids"; //$NON-NLS-1$
	public static final String FILE_PATH = "File.path"; //$NON-NLS-1$
	public static final String FILE_MODE = "File.mode"; //$NON-NLS-1$
	public static final String PREPEND_TIMESTAMP = "Prepend.Timestamp.enable"; //$NON-NLS-1$
	
	public static final String LOAD_HISTORY = "History.LoadAtStartup.enable"; //$NON-NLS-1$
	
	
	public void load(final TrackingConfiguration trackingConfig, final ILaunchConfiguration launchConfig) throws CoreException {
		final String id = trackingConfig.getId();
		
		trackingConfig.setName(launchConfig.getAttribute(id+'.'+LABEL_KEY, "")); //$NON-NLS-1$
		
		trackingConfig.setTrackStreamInfo(launchConfig.getAttribute(id+'.'+TRACK_STREAM_INFO, false));
		trackingConfig.setTrackStreamInput(launchConfig.getAttribute(id+'.'+TRACK_STREAM_INPUT, false));
		trackingConfig.setTrackStreamInputHistoryOnly(launchConfig.getAttribute(id+'.'+TRACK_STREAM_INPUT_HISTORYONLY, false));
		trackingConfig.setTrackStreamOutput(launchConfig.getAttribute(id+'.'+TRACK_STREAM_OUTPUT, false));
		trackingConfig.setTrackStreamOutputTruncate(launchConfig.getAttribute(id+'.'+TRACK_STREAM_OUTPUT_TRUNCATE, false));
		trackingConfig.setTrackStreamOutputTruncateLines(launchConfig.getAttribute(id+'.'+TRACK_STREAM_OUTPUT_TRUNCATE_LINES, 1000000));
		
		final List<String> submitTypeNames = launchConfig.getAttribute(id+'.'+SUBMIT_TYPES, (List<String>) null);
		if (submitTypeNames != null) {
			final EnumSet<SubmitType> submitTypes = EnumSet.noneOf(SubmitType.class);
			for (final String name : submitTypeNames) {
				submitTypes.add(SubmitType.valueOf(name));
			}
			trackingConfig.setSubmitTypes(submitTypes);
		}
		else {
			trackingConfig.setSubmitTypes(SubmitType.getDefaultSet());
		}
		
		trackingConfig.setFilePath(launchConfig.getAttribute(id+'.'+FILE_PATH, "")); //$NON-NLS-1$
		trackingConfig.setFileMode(launchConfig.getAttribute(id+'.'+FILE_MODE, TrackingConfiguration.DEFAULT_FILE_MODE));
		
		trackingConfig.setPrependTimestamp(launchConfig.getAttribute(id+'.'+PREPEND_TIMESTAMP, false));
		
		if (id.equals(HistoryTrackingConfiguration.HISTORY_TRACKING_ID)
				&& launchConfig instanceof HistoryTrackingConfiguration) {
			((HistoryTrackingConfiguration) launchConfig).setLoadHistory(launchConfig.getAttribute(id+'.'+LOAD_HISTORY, false));
		}
	}
	
	public void save(final TrackingConfiguration trackingConfig, final ILaunchConfigurationWorkingCopy launchConfig) {
		final String id = trackingConfig.getId();
		
		launchConfig.setAttribute(id+'.'+LABEL_KEY, trackingConfig.getName());
		
		launchConfig.setAttribute(id+'.'+TRACK_STREAM_INFO, trackingConfig.getTrackStreamInfo());
		launchConfig.setAttribute(id+'.'+TRACK_STREAM_INPUT, trackingConfig.getTrackStreamInput());
		launchConfig.setAttribute(id+'.'+TRACK_STREAM_INPUT_HISTORYONLY, trackingConfig.getTrackStreamInputHistoryOnly());
		launchConfig.setAttribute(id+'.'+TRACK_STREAM_OUTPUT, trackingConfig.getTrackStreamOutput());
		launchConfig.setAttribute(id+'.'+TRACK_STREAM_OUTPUT_TRUNCATE, trackingConfig.getTrackStreamOutputTruncate());
		launchConfig.setAttribute(id+'.'+TRACK_STREAM_OUTPUT_TRUNCATE_LINES, trackingConfig.getTrackStreamOutputTruncateLines());
		
		final EnumSet<SubmitType> submitTypes = trackingConfig.getSubmitTypes();
		final List<String> submitTypeNames= new ArrayList<>(submitTypes.size());
		for (final SubmitType submitType : submitTypes) {
			submitTypeNames.add(submitType.name());
		}
		launchConfig.setAttribute(id+'.'+SUBMIT_TYPES, submitTypeNames);
		
		launchConfig.setAttribute(id+'.'+FILE_PATH, trackingConfig.getFilePath());
		launchConfig.setAttribute(id+'.'+FILE_MODE, trackingConfig.getFileMode());
		
		launchConfig.setAttribute(id+'.'+PREPEND_TIMESTAMP, trackingConfig.getPrependTimestamp());
		
		if (id.equals(HistoryTrackingConfiguration.HISTORY_TRACKING_ID)
				&& launchConfig instanceof HistoryTrackingConfiguration) {
			launchConfig.setAttribute(id+'.'+LOAD_HISTORY, ((HistoryTrackingConfiguration) launchConfig).getLoadHistory());
		}
	}
	
}
