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

import java.io.*;
import java.net.URL;
import java.util.Enumeration;
import java.util.Properties;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.*;
import org.eclipse.pde.internal.build.IBuildPropertiesConstants;

public class BuildConfiguration {
	public static final String TRUE = "true";
	public static final String FALSE = "false";

	private static Properties defaultBuildConfig = new Properties();
	private static Properties defaultScriptConfig = new Properties();
	static {
		// use the template build.properties from pde.build
		URL resource = FileLocator.find(Platform.getBundle("org.eclipse.pde.build"),
				new Path("/templates/headless-build/build.properties"), null);
		try {
			String buildPropertiesPath = FileLocator.toFileURL(resource).getPath();
			defaultBuildConfig.load(new BufferedInputStream(new FileInputStream(buildPropertiesPath)));
		} catch (IOException e) {
		}

		// just a few changes from the template
		defaultBuildConfig.put("archiveNamePrefix", "eclipse");
		String baseLocation = Platform.getInstallLocation().getURL().getPath();
		defaultBuildConfig.put("base", new File(baseLocation).getParent());
		defaultBuildConfig.put("baseLocation", baseLocation);
		defaultBuildConfig.put("baseos", Platform.getOS());
		defaultBuildConfig.put("basews", Platform.getWS());
		defaultBuildConfig.put("basearch", Platform.getOSArch());
		defaultBuildConfig.put("filterP2Base", TRUE);

		String version = System.getProperty("java.specification.version"); //$NON-NLS-1$
		boolean isJava9OrGreater = false;
		if (version != null) {
			String[] nums = version.split("\\."); //$NON-NLS-1$
			if (nums.length == 1) {
				// java 9 and above
				try {
					int major = Integer.parseInt(nums[0]);
					if (major >= 9) {
						isJava9OrGreater = true;
					}

				} catch (NumberFormatException e) {
				}
			}
		}
		if (isJava9OrGreater == false)
			defaultBuildConfig.put("bootclasspath", System.getProperty("sun.boot.class.path"));

		defaultScriptConfig = (Properties) defaultBuildConfig.clone();
		if (!defaultBuildConfig.containsKey("configs"))
			defaultScriptConfig.put("configs", "*,*,*");
		if (!defaultBuildConfig.containsKey("buildingOSGi"))
			defaultScriptConfig.put("buildingOSGi", TRUE);
		if (!defaultBuildConfig.containsKey("signJars"))
			defaultScriptConfig.put("signJars", FALSE);
		if (!defaultBuildConfig.containsKey("generateFeatureVersionSuffix"))
			defaultScriptConfig.put("generateFeatureVersionSuffix", FALSE);
		if (!defaultBuildConfig.containsKey("generateVersionsLists"))
			defaultScriptConfig.put("generateVersionsLists", TRUE);
		if (!defaultBuildConfig.containsKey("groupConfigurations"))
			defaultScriptConfig.put("groupConfigurations", FALSE);
		if (!defaultBuildConfig.containsKey("pluginPath"))
			defaultScriptConfig.put("pluginPath", "");
		if (!defaultBuildConfig.containsKey("filteredDependencyCheck"))
			defaultScriptConfig.put("filteredDependencyCheck", FALSE);
	}

	private static Properties getBuildConfig() {
		Properties properties = new Properties();
		Enumeration<Object> e = defaultBuildConfig.keys();
		while (e.hasMoreElements()) {
			String key = (String) e.nextElement();
			properties.put(key, defaultBuildConfig.get(key));
		}

		return properties;
	}

	/**
	 * Get a default build configuration build.properties based on the template from
	 * pde.build
	 * 
	 * @param buildFolder
	 * @return
	 */
	public static Properties getBuilderProperties(IFolder buildFolder) {
		String builder = buildFolder.getLocation().toOSString();
		Properties builderProperties = getBuildConfig();
		builderProperties.put("buildDirectory", builder);
		builderProperties.put("builder", builder);
		builderProperties.put(IBuildPropertiesConstants.PROPERTY_SUPPRESS_RESOLUTION_ERRORS, TRUE);
		return builderProperties;
	}

	/**
	 * Get a default set of properties used for invoking the
	 * genericTargets/generateScript task (which invokes the eclipse.buildScript
	 * target)
	 * 
	 * @param buildFolder
	 * @param type
	 * @param id
	 * @return
	 */
	public static Properties getScriptGenerationProperties(IFolder buildFolder, String type, String id) {
		Properties properties = (Properties) defaultScriptConfig.clone();
		properties.put("type", type);
		properties.put("id", id);
		properties.put("buildDirectory", buildFolder.getLocation().toOSString());
		properties.put(IBuildPropertiesConstants.PROPERTY_SUPPRESS_RESOLUTION_ERRORS, TRUE);
		return properties;
	}
}
