/*******************************************************************************
 * Copyright (c) 2019, 2020 GK Software SE 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:
 *     Stephan Herrmann - initial API and implementation
 *     IBM Corporation - bug fixes
 *******************************************************************************/
package org.eclipse.jdt.debug.tests.core;

import java.util.Arrays;
import java.util.List;

import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.launching.JavaRuntime;

public class ModuleOptionsTests extends AbstractDebugTest {

	private static final String ASSUMED_DEFAULT_MODULES_9 = "java.se," //
			+ "javafx.base,javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web," // REMOVED in 10
			+ "jdk.accessibility,jdk.attach,jdk.compiler,jdk.dynalink,jdk.httpserver,"//
			+ "jdk.incubator.httpclient," //
			+ "jdk.jartool,jdk.javadoc,jdk.jconsole,jdk.jdi,"//
			+ "jdk.jfr," // all but 10
			+ "jdk.jshell,jdk.jsobject,jdk.management,"//
			+ "jdk.management.cmm,jdk.management.jfr,jdk.management.resource," // REMOVED later
			+ "jdk.net," //
			+ "jdk.packager,jdk.packager.services,jdk.plugin.dom," // NOT in openjdk
			+ "jdk.scripting.nashorn,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
			+ "jdk.xml.dom,"//
			+ "oracle.desktop,oracle.net"; // NOT in openjdk
	private static final String ASSUMED_DEFAULT_MODULES_10 = "java.se," //
			+ "jdk.accessibility,jdk.attach,jdk.compiler,jdk.dynalink,jdk.httpserver," //
			+ "jdk.incubator.httpclient," // REMOVED later
			+ "jdk.jartool,jdk.javadoc,jdk.jconsole,jdk.jdi," //
			+ "jdk.jshell,jdk.jsobject,jdk.management," //
			+ "jdk.net," //
			+ "jdk.scripting.nashorn,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
			+ "jdk.xml.dom";
	private static final String ASSUMED_DEFAULT_MODULES_12 = "java.se," //
			+ "jdk.accessibility,jdk.attach,jdk.compiler,jdk.dynalink,jdk.httpserver," //
			+ "jdk.jartool,jdk.javadoc,jdk.jconsole,jdk.jdi," //
			+ "jdk.jfr," // all but 10
			+ "jdk.jshell,jdk.jsobject,jdk.management," //
			+ "jdk.management.jfr," // all but 10
			+ "jdk.net," //
			+ "jdk.scripting.nashorn,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
			+ "jdk.unsupported.desktop," // NEW
			+ "jdk.xml.dom";
	private static final String ASSUMED_DEFAULT_MODULES_14 = "java.se," //
			+ "jdk.accessibility,jdk.attach,jdk.compiler,jdk.dynalink,jdk.httpserver," //
			+ "jdk.incubator.foreign," // NEW in 14
			+ "jdk.jartool,jdk.javadoc,jdk.jconsole,jdk.jdi," //
			+ "jdk.jfr," //
			+ "jdk.jshell,jdk.jsobject,jdk.management," //
			+ "jdk.management.jfr," //
			+ "jdk.net," //
			+ "jdk.nio.mapmode," // NEW in 14
			+ "jdk.scripting.nashorn,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
			+ "jdk.unsupported.desktop," // since 12
			+ "jdk.xml.dom";
	private static final String ASSUMED_DEFAULT_MODULES_15 = "java.se," //
			+ "jdk.accessibility,jdk.attach,jdk.compiler,jdk.dynalink,jdk.httpserver," //
			+ "jdk.incubator.foreign," //
			+ "jdk.jartool,jdk.javadoc,jdk.jconsole,jdk.jdi," //
			+ "jdk.jfr," //
			+ "jdk.jshell,jdk.jsobject,jdk.management," //
			+ "jdk.management.jfr," //
			+ "jdk.net," //
			+ "jdk.nio.mapmode," //
			+ "jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported," // jdk.scripting.nashorn removed in 15
			+ "jdk.unsupported.desktop," //
			+ "jdk.xml.dom";


	public ModuleOptionsTests(String name) {
		super(name);
	}

	@Override
	protected IJavaProject getProjectContext() {
		return get9Project();
	}

	protected void addClasspathAttributesToSystemLibrary(IJavaProject project, IClasspathAttribute[] extraAttributes) throws JavaModelException {
		IClasspathEntry[] rawClasspath = project.getRawClasspath();
		int i = indexOfJREContainer(rawClasspath);
		rawClasspath[i] = JavaCore.newContainerEntry(rawClasspath[i].getPath(), null, extraAttributes, false);
		project.setRawClasspath(rawClasspath, null);
		waitForBuild();
	}

	protected void removeClasspathAttributesFromSystemLibrary(IJavaProject project) throws JavaModelException {
		IClasspathEntry[] rawClasspath = project.getRawClasspath();
		int i = indexOfJREContainer(rawClasspath);
		rawClasspath[i] = JavaCore.newContainerEntry(rawClasspath[i].getPath(), null, new IClasspathAttribute[0], false);
		project.setRawClasspath(rawClasspath, null);
		waitForBuild();
	}

	private List<String> getDefaultModules(IJavaProject javaProject) throws JavaModelException {
		IClasspathEntry[] rawClasspath = javaProject.getRawClasspath();
		int i = indexOfJREContainer(rawClasspath);
		List<String> list = JavaCore.defaultRootModules(Arrays.asList(javaProject.findUnfilteredPackageFragmentRoots(rawClasspath[i])));
		list.sort(String::compareTo);
		return list;
	}

	private int indexOfJREContainer(IClasspathEntry[] rawClasspath) {
		for (int i = 0; i < rawClasspath.length; i++) {
			IClasspathEntry classpathEntry = rawClasspath[i];
			if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER
					&& JavaRuntime.JRE_CONTAINER.equals(classpathEntry.getPath().segment(0))) {
				return i;
			}
		}
		return -1;
	}

	public void testAddModules1() throws JavaModelException {
		IJavaProject javaProject = getProjectContext();
		List<String> defaultModules = getDefaultModules(javaProject);
		defaultModules.add("jdk.crypto.cryptoki"); // requires jdk.crypto.ec
		try {
			IClasspathAttribute[] attributes = {
					JavaCore.newClasspathAttribute(IClasspathAttribute.LIMIT_MODULES, String.join(",", defaultModules))
			};
			addClasspathAttributesToSystemLibrary(javaProject, attributes);

			ILaunchConfiguration launchConfiguration = getLaunchConfiguration(javaProject, "LogicalStructures");
			String cliOptions = JavaRuntime.getModuleCLIOptions(launchConfiguration);
			assertEquals("Unexpectd cli options", "--add-modules jdk.crypto.cryptoki,jdk.crypto.ec", cliOptions);
		} finally {
			removeClasspathAttributesFromSystemLibrary(javaProject);
		}
	}

	public void testLimitModules1() throws JavaModelException {
		IJavaProject javaProject = getProjectContext();
		List<String> defaultModules = getDefaultModules(javaProject);
		String expectedModules;
		switch (String.join(",", defaultModules)) {
			case ASSUMED_DEFAULT_MODULES_9:
				expectedModules = "java.se," //
						+ "javafx.fxml,javafx.swing,javafx.web," //
						+ "jdk.accessibility,jdk.httpserver,jdk.incubator.httpclient,"
						+ "jdk.jartool,jdk.jconsole,jdk.jshell," //
						+ "jdk.management.cmm,jdk.management.jfr,jdk.management.resource," //
						+ "jdk.net," //
						+ "jdk.packager,jdk.packager.services,jdk.plugin.dom," //
						+ "jdk.scripting.nashorn,jdk.sctp,"
						+ "jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
						+ "oracle.desktop,oracle.net";
				break;
			case ASSUMED_DEFAULT_MODULES_10:
				expectedModules = "java.se," //
						+ "jdk.accessibility,jdk.httpserver,jdk.incubator.httpclient," //
						+ "jdk.jartool,jdk.jconsole,jdk.jshell," //
						+ "jdk.jsobject," // previously pulled in via javafx.*
						+ "jdk.net," //
						+ "jdk.scripting.nashorn,jdk.sctp," //
						+ "jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
						+ "jdk.xml.dom";
				break;
			case ASSUMED_DEFAULT_MODULES_12:
				expectedModules = "java.se," //
						+ "jdk.accessibility,jdk.httpserver," //
						+ "jdk.jartool,jdk.jconsole,jdk.jshell," //
						+ "jdk.jsobject," //
						+ "jdk.management.jfr," // all but 10
						+ "jdk.net," //
						+ "jdk.scripting.nashorn,jdk.sctp," //
						+ "jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
						+ "jdk.unsupported.desktop," // NEW
						+ "jdk.xml.dom";
				break;
			case ASSUMED_DEFAULT_MODULES_14:
				expectedModules = "java.se," //
						+ "jdk.accessibility,jdk.httpserver," //
						+ "jdk.incubator.foreign," // NEW in 14
						+ "jdk.jartool,jdk.jconsole,jdk.jshell," //
						+ "jdk.jsobject," //
						+ "jdk.management.jfr," //
						+ "jdk.net," //
						+ "jdk.nio.mapmode," // NEW in 14
						+ "jdk.scripting.nashorn,jdk.sctp," //
						+ "jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
						+ "jdk.unsupported.desktop," //
						+ "jdk.xml.dom";
				break;
			case ASSUMED_DEFAULT_MODULES_15:
				expectedModules = "java.se," //
						+ "jdk.accessibility," //
						+ "jdk.dynalink," // New in 15
						+ "jdk.httpserver," //
						+ "jdk.incubator.foreign," //
						+ "jdk.jartool,jdk.jconsole,jdk.jshell," //
						+ "jdk.jsobject," //
						+ "jdk.management.jfr," //
						+ "jdk.net," //
						+ "jdk.nio.mapmode," //
						+ "jdk.sctp," // Removed jdk.scripting.nashorn in 15
						+ "jdk.security.auth,jdk.security.jgss,jdk.unsupported," //
						+ "jdk.unsupported.desktop," //
						+ "jdk.xml.dom";
				break;
			default:
				fail("Unknown set of default modules " + String.join(",", defaultModules));
				return;
		}
		assertTrue("expected module was not in defaultModules", defaultModules.remove("jdk.javadoc")); // requires java.compiler and jdk.compiler but
																										// is required by no default module
		try {
			IClasspathAttribute[] attributes = {
					JavaCore.newClasspathAttribute(IClasspathAttribute.LIMIT_MODULES, String.join(",", defaultModules)) };
			addClasspathAttributesToSystemLibrary(javaProject, attributes);

			ILaunchConfiguration launchConfiguration = getLaunchConfiguration(javaProject, "LogicalStructures");
			String cliOptions = JavaRuntime.getModuleCLIOptions(launchConfiguration);
			assertEquals("Unexpectd cli options", "--limit-modules " + expectedModules, cliOptions);
		} finally {
			removeClasspathAttributesFromSystemLibrary(javaProject);
		}
	}
}
