apply plugin: 'io.spring.convention.spring-module'

configurations {
	opensamlFiveMain { extendsFrom(optional, provided) }
	opensamlFiveTest { extendsFrom(opensamlFiveMain, testImplementation, testRuntimeOnly) }
}

sourceSets {
	opensaml4Main {
		java {
			compileClasspath += main.output
			srcDir 'src/opensaml4Main/java'
		}
	}
	opensaml5Main {
		java {
			compileClasspath = main.output + configurations.opensamlFiveMain
			srcDir 'src/opensaml5Main/java'
		}
	}
	opensaml4Test {
		java {
			compileClasspath += main.output + test.output + opensaml4Main.output + test.compileClasspath
			runtimeClasspath += main.output + test.output + opensaml4Main.output + test.runtimeClasspath
			srcDir 'src/opensaml4Test/java'
		}
	}
	opensaml5Test {
		java {
			compileClasspath = main.output + test.output + opensaml5Main.output + configurations.opensamlFiveTest
			runtimeClasspath = main.output + test.output + opensaml5Main.output + configurations.opensamlFiveTest
			srcDir 'src/opensaml5Test/java'
		}
	}
}

sourceSets.configureEach { set ->
	if (!set.name.containsIgnoreCase("main")) {
		return
	}
	def from = copySpec {
		from("$projectDir/src/$set.name/java/org/springframework/security/saml2/internal")
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/authentication/logout"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.authentication.logout") }
		with from
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/authentication"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.authentication") }
		with from
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/metadata"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.metadata") }
		with from
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/web/authentication/logout"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.web.authentication.logout") }
		with from
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/web/authentication"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.web.authentication") }
		with from
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/web"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.web") }
		with from
	}

	copy {
		into "$projectDir/src/$set.name/java/org/springframework/security/saml2/provider/service/registration"
		filter { line -> line.replaceAll(".saml2.internal", ".saml2.provider.service.registration") }
		with from
	}
}

dependencies {
	management platform(project(":spring-security-dependencies"))
	api project(':spring-security-web')

	api ('org.opensaml:opensaml-saml-api')  {
		exclude group: 'commons-logging', module: 'commons-logging'
	}
	api ('org.opensaml:opensaml-saml-impl')  {
		exclude group: 'commons-logging', module: 'commons-logging'
	}

	opensamlFiveMain (libs.org.opensaml.opensaml5.saml.api)  {
		exclude group: 'commons-logging', module: 'commons-logging'
	}
	opensamlFiveMain (libs.org.opensaml.opensaml5.saml.impl)  {
		exclude group: 'commons-logging', module: 'commons-logging'
	}

	provided 'jakarta.servlet:jakarta.servlet-api'

	optional 'com.fasterxml.jackson.core:jackson-databind'

	testImplementation 'com.squareup.okhttp3:mockwebserver'
	testImplementation "org.assertj:assertj-core"
	testImplementation "org.skyscreamer:jsonassert"
	testImplementation "org.junit.jupiter:junit-jupiter-api"
	testImplementation "org.junit.jupiter:junit-jupiter-params"
	testImplementation "org.junit.jupiter:junit-jupiter-engine"
	testImplementation "org.mockito:mockito-core"
	testImplementation "org.mockito:mockito-junit-jupiter"
	testImplementation "org.springframework:spring-test"

	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

jar {
	duplicatesStrategy = DuplicatesStrategy.EXCLUDE
	from sourceSets.opensaml4Main.output
	from sourceSets.opensaml5Main.output
}

sourcesJar {
	duplicatesStrategy = DuplicatesStrategy.EXCLUDE
	from sourceSets.opensaml4Main.allJava
	from sourceSets.opensaml5Main.allJava
}

testJar {
	duplicatesStrategy = DuplicatesStrategy.EXCLUDE
	from sourceSets.opensaml4Test.output
	from sourceSets.opensaml5Test.output
}

javadoc {
	classpath += configurations.opensamlFiveMain
	source = sourceSets.main.allJava + sourceSets.opensaml4Main.allJava + sourceSets.opensaml5Main.allJava
}

tasks.register("opensaml4Test", Test) {
	useJUnitPlatform()
	testClassesDirs = sourceSets.opensaml4Test.output.classesDirs
	classpath = sourceSets.opensaml4Test.runtimeClasspath
}

tasks.register("opensaml5Test", Test) {
	useJUnitPlatform()
	testClassesDirs = sourceSets.opensaml5Test.output.classesDirs
	classpath = sourceSets.opensaml5Test.output + sourceSets.opensaml5Test.runtimeClasspath
}

tasks.named("test") {
	dependsOn opensaml4Test
	dependsOn opensaml5Test
}
