/*******************************************************************************
 * Copyright (c) 2013, 2016 Red Hat, Inc. 
 * 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:
 * 		 Red Hat Inc. - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.thym.ui.wizard.export;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.thym.core.HybridCore;
import org.eclipse.thym.core.platform.AbstractNativeBinaryBuildDelegate;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.IOverwriteQuery;

public class NativeBinaryExportOperation extends WorkspaceModifyOperation {

	private List<AbstractNativeBinaryBuildDelegate> delegates;
	private IOverwriteQuery overwriteQuery;
	private File destinationDir;
	
	public NativeBinaryExportOperation(
			List<AbstractNativeBinaryBuildDelegate> delegates,
			File destination,
			IOverwriteQuery query) {
		this.delegates = delegates;
		this.overwriteQuery = query;
		this.destinationDir = destination;
	}

	@Override
	protected void execute(IProgressMonitor monitor) throws CoreException,
			InvocationTargetException, InterruptedException {
		SubMonitor sm = SubMonitor.convert(monitor);
		sm.setWorkRemaining(delegates.size()*10);
		for (AbstractNativeBinaryBuildDelegate delegate : delegates) {
			if(monitor.isCanceled()){ 
				break; 
			}
			delegate.setRelease(true);
			delegate.buildNow(sm.newChild(10));
			try {
				File buildArtifact = delegate.getBuildArtifact();
				File destinationFile = new File(destinationDir, buildArtifact.getName());
				if(destinationFile.exists()){
					String callback = overwriteQuery.queryOverwrite(destinationFile.toString());
					if(IOverwriteQuery.NO.equals(callback)){
						continue;
					}
					if(IOverwriteQuery.CANCEL.equals(callback)){
						break;
					}
				}
				File artifact = delegate.getBuildArtifact();
				if(artifact.isDirectory()){
					FileUtils.copyDirectoryToDirectory(artifact, destinationDir);
				}else{
					FileUtils.copyFileToDirectory(artifact, destinationDir);
				}
				sm.done();
			} catch (IOException e) {
				HybridCore.log(IStatus.ERROR, "Error on NativeBinaryExportOperation", e);
			}
		}
		monitor.done(); 
	}
}