/*******************************************************************************
 * Copyright (c) 2017 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Patrick Tasse - Initial API and implementation
 *******************************************************************************/

package org.eclipse.tracecompass.tmf.ui.actions;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.FileSystemObjectImportStructureProvider;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.IFileSystemObject;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.ImportTraceWizardPage;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.TraceFileSystemElement;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.TraceValidateAndImportOperation;
import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;

/**
 * An operation which imports traces from a source folder to a target folder.
 * <p>
 * By default, the operation will import all traces from the source folder
 * recursively, using trace type auto-detection, preserving the folder structure
 * and creating links for each imported trace in the target folder, overwriting
 * any existing trace without warning.
 *
 * @since 3.0
 */
public class TraceImportOperation extends WorkspaceModifyOperation {

    private final String fSourcePath;
    private final TmfTraceFolder fDestFolder;

    private boolean fSkipArchiveExtraction = false;

    private ITmfTimestamp fStartTimeRange = null;
    private ITmfTimestamp fEndTimeRange = null;

    /**
     * Constructor
     *
     * @param sourcePath
     *            the source path
     * @param destFolder
     *            the destination folder
     */
    public TraceImportOperation(String sourcePath, TmfTraceFolder destFolder) {
        fSourcePath = sourcePath;
        fDestFolder = destFolder;
    }

    /**
     * Sets the skip archive extraction option. When set to true, archive files
     * will be imported directly without being detected or extracted.
     *
     * @param skipArchiveExtraction
     *            true to skip archive extraction
     * @since 3.1
     */
    public void setSkipArchiveExtraction(boolean skipArchiveExtraction) {
        fSkipArchiveExtraction = skipArchiveExtraction;
    }

    /**
     * Sets the range for timestamps based filtering import.
     *
     * @param start
     *            Start time of the range
     * @param end
     *            End time of the range
     * @since 3.1
     */
    public void setFilteringTimeRange(ITmfTimestamp start, ITmfTimestamp end) {
        if (start.compareTo(end) < 0) {
            fStartTimeRange = start;
            fEndTimeRange = end;
        }
    }

    @Override
    protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
        int importOptionFlags =
                ImportTraceWizardPage.OPTION_CREATE_LINKS_IN_WORKSPACE |
                ImportTraceWizardPage.OPTION_OVERWRITE_EXISTING_RESOURCES |
                ImportTraceWizardPage.OPTION_PRESERVE_FOLDER_STRUCTURE;
        if (fSkipArchiveExtraction) {
            importOptionFlags |= ImportTraceWizardPage.OPTION_SKIP_ARCHIVE_EXTRACTION;
        }
        if(fStartTimeRange != null && fEndTimeRange != null) {
            importOptionFlags |= ImportTraceWizardPage.OPTION_FILTER_TIMERANGE;
        }
        IPath baseSourceContainerPath = new Path(fSourcePath);
        IPath destinationContainerPath = fDestFolder.getPath();
        FileSystemObjectImportStructureProvider provider = new FileSystemObjectImportStructureProvider(FileSystemStructureProvider.INSTANCE, null);
        IFileSystemObject object = provider.getIFileSystemObject(new File(fSourcePath));
        TraceFileSystemElement root = TraceFileSystemElement.createRootTraceFileElement(object, provider);
        List<TraceFileSystemElement> fileSystemElements = new ArrayList<>();
        root.getAllChildren(fileSystemElements);
        final TraceValidateAndImportOperation importOperation = new TraceValidateAndImportOperation(
                null, fileSystemElements, null,
                baseSourceContainerPath, destinationContainerPath, false,
                importOptionFlags, fDestFolder, fStartTimeRange, fEndTimeRange, null, false);
        try {
            importOperation.run(monitor);
        } catch (InvocationTargetException e) {
            Activator.getDefault().logError("Error running trace import operation", e); //$NON-NLS-1$
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        monitor.done();
    }

}
