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

description = "JUnit Platform Console Standalone"

dependencies {
	shadowed(projects.junitPlatformReporting)
	shadowed(projects.junitPlatformConsole)
	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")
	}
}
