/*******************************************************************************
 * Copyright (c) 2008, 2018 IBM Corporation and others.
 *
 * 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: IBM - Initial API and implementation
 ******************************************************************************/
package org.eclipse.pde.internal.build.builder;

import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.pde.internal.build.*;

public class CompilationScriptGenerator extends AbstractScriptGenerator {

	private String featureId = "all"; //$NON-NLS-1$
	private boolean parallel = true;
	private int threadCount = 0;
	private int threadsPerProcessor = 3;

	/** Contain the elements that will be assembled */
	protected AssemblyInformation assemblyData;
	protected BuildDirector director;

	@Override
	public void generate() throws CoreException {
		openScript(getWorkingDirectory(), getScriptName());
		try {
			generateScript();
		} finally {
			closeScript();
		}
	}

	public void setAssemblyData(AssemblyInformation assemblyData) {
		this.assemblyData = assemblyData;
	}

	public void setFeatureId(String featureId) {
		this.featureId = featureId;
	}

	public void setDirector(BuildDirector director) {
		this.director = director;
	}

	public void setParallel(boolean parallel) {
		this.parallel = parallel;
	}

	public void setThreadCount(int count) {
		if (count != -1)
			this.threadCount = count;
	}

	public void setThreadsPerProcessor(int threads) {
		if (threads != -1)
			this.threadsPerProcessor = threads;
	}

	protected String getScriptName() {
		return DEFAULT_COMPILE_NAME + '.' + featureId + ".xml"; //$NON-NLS-1$
	}

	private void generateScript() throws CoreException {
		generatePrologue();
		generatePlugins();
		generateEpilogue();
	}

	private void generatePrologue() {
		script.printProjectDeclaration("Compile " + featureId, TARGET_MAIN, null); //$NON-NLS-1$

		script.printTargetDeclaration(TARGET_MAIN, null, null, null, null);
	}

	private void generateEpilogue() {
		script.printTargetEnd();
		script.printProjectEnd();
	}

	private void generatePlugins() throws CoreException {
		Set<BundleDescription> plugins = assemblyData.getAllCompiledPlugins();
		List<BundleDescription> sortedPlugins = Utils.extractPlugins(getSite(false).getRegistry().getSortedBundles(), plugins);
		IPath basePath = new Path(workingDirectory);

		Set<Long> bucket = null;
		if (parallel) {
			bucket = new HashSet<>();
			script.printParallel(threadCount, threadsPerProcessor);
		}

		for (Iterator<BundleDescription> iterator = sortedPlugins.iterator(); iterator.hasNext();) {
			BundleDescription bundle = iterator.next();
			// Individual source bundles have empty build.jars targets, skip them
			if (Utils.isSourceBundle(bundle))
				continue;

			if (parallel) {
				if (requiredInBucket(bundle, bucket)) {
					script.printEndParallel();
					script.printParallel(threadCount, threadsPerProcessor);
					bucket.clear();
				}
				bucket.add(Long.valueOf(bundle.getBundleId()));
			}

			IPath location = Utils.makeRelative(new Path(getLocation(bundle)), basePath);
			script.printAntTask(DEFAULT_BUILD_SCRIPT_FILENAME, location.toString(), TARGET_BUILD_JARS, null, null, null);
		}

		if (parallel)
			script.printEndParallel();
	}

	private boolean requiredInBucket(BundleDescription bundle, Set<Long> bucket) {
		Properties properties = (Properties) bundle.getUserObject();
		if (properties != null) {
			String required = properties.getProperty(PROPERTY_REQUIRED_BUNDLE_IDS);
			if (required != null) {
				String[] ids = Utils.getArrayFromString(required, ":"); //$NON-NLS-1$
				for (int i = 0; i < ids.length; i++) {
					try {
						if (bucket.contains(Long.valueOf(ids[i]))) {
							return true;
						}
					} catch (NumberFormatException e) {
						//ignore
					}
				}
			}
		}
		return false;
	}
}
