plugins {
	`java-library-conventions`
	`shadow-conventions`
}

description = "JUnit Platform Console Standalone"

dependencies {
	shadowed(projects.junitPlatformReporting)
	shadowed(projects.junitPlatformConsole)
	shadowed(projects.junitPlatformSuite)
	shadowed(projects.junitJupiterEngine)
	shadowed(projects.junitJupiterParams)
	shadowed(projects.junitVintageEngine)
	shadowed(libs.apiguardian) {
		because("downstream projects need it to avoid compiler warnings")
	}
}

val jupiterVersion = rootProject.version
val vintageVersion: String by project

tasks {
	jar {
		manifest {
			attributes("Main-Class" to "org.junit.platform.console.ConsoleLauncher")
		}
	}
	val shadowedArtifactsFile by registering {
		inputs.files(configurations.shadowed).withNormalizer(ClasspathNormalizer::class)
		val outputFile = layout.buildDirectory.file("shadowed-artifacts")
		outputs.file(outputFile)
		doFirst {
			outputFile.get().asFile.printWriter().use { out ->
				configurations.shadowed.get().resolvedConfiguration.resolvedArtifacts
					.map { it.moduleVersion.id }
					.map { "${it.group}:${it.name}:${it.version}" }
					.sorted()
					.forEach(out::println)
			}
		}
	}
	shadowJar {
		// https://github.com/junit-team/junit5/issues/2557
		// exclude compiled module declarations from any source (e.g. /*, /META-INF/versions/N/*)
		exclude("**/module-info.class")
		// https://github.com/junit-team/junit5/issues/761
		// prevent duplicates, add 3rd-party licenses explicitly
		exclude("META-INF/LICENSE*.md")
		from(project.projects.junitPlatformConsole.dependencyProject.projectDir) {
			include("LICENSE-picocli.md")
			into("META-INF")
		}
		from(project.projects.junitJupiterParams.dependencyProject.projectDir) {
			include("LICENSE-univocity-parsers.md")
			into("META-INF")
		}
		from(shadowedArtifactsFile) {
			into("META-INF")
		}

		bundle {
			bnd("""
				# Customize the imports because this is an aggregate jar
				Import-Package: \
					${extra["importAPIGuardian"]},\
					kotlin.*;resolution:="optional",\
					*
				# Disable the APIGuardian plugin since everything was already
				# processed, again because this is an aggregate jar
				-export-apiguardian:
			""")
		}

		mergeServiceFiles()
		manifest.apply {
			inheritFrom(jar.get().manifest)
			attributes(mapOf(
					"Specification-Title" to project.name,
					"Implementation-Title" to project.name,
					// Generate test engine version information in single shared manifest file.
					// Pattern of key and value: `"Engine-Version-{YourTestEngine#getId()}": "47.11"`
					"Engine-Version-junit-jupiter" to jupiterVersion,
					"Engine-Version-junit-vintage" to vintageVersion,
					// Version-aware binaries are already included - set Multi-Release flag here.
					// See https://openjdk.java.net/jeps/238 for details
					// Note: the "jar --update ... --release X" command does not work with the
					// shadowed JAR as it contains nested classes that do not comply with multi-release jars.
					"Multi-Release" to true
			))
		}
	}

	// This jar contains some Java 9 code
	// (org.junit.platform.console.ConsoleLauncherToolProvider which implements
	// java.util.spi.ToolProvider which is @since 9).
	// So in order to resolve this, it can only run on Java 9
	osgiProperties {
		property("-runee", "JavaSE-9")
	}
}
