/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * License); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import groovy.json.JsonOutput

plugins { id 'org.apache.beam.module' }
applyJavaNature(
        automaticModuleName: 'org.apache.beam.sdk.io.debezium',
        mavenRepositories: [
                [id: 'io.confluent', url: 'https://packages.confluent.io/maven/']
        ],
        requireJavaVersion: JavaVersion.VERSION_17,
)
provideIntegrationTestingDependencies()

description = "Apache Beam :: SDKs :: Java :: IO :: Debezium"
ext.summary = "Library to work with Debezium data."

dependencies {
    implementation library.java.vendored_guava_32_1_2_jre
    implementation library.java.vendored_grpc_1_69_0
    implementation project(path: ":sdks:java:core", configuration: "shadow")
    implementation library.java.slf4j_api
    implementation library.java.joda_time
    // Explicitly declare Jackson dependencies
    // and align with the 2.17.1 version.
    implementation 'com.fasterxml.jackson.core:jackson-core:2.17.1'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1'
    permitUnusedDeclared 'com.fasterxml.jackson.core:jackson-core:2.17.1'
    permitUnusedDeclared 'com.fasterxml.jackson.core:jackson-databind:2.17.1'
    provided library.java.jackson_dataformat_csv
    permitUnusedDeclared library.java.jackson_dataformat_csv

    // Kafka connect dependencies
    implementation "org.apache.kafka:connect-api:3.9.0"

    // Debezium dependencies
    implementation group: 'io.debezium', name: 'debezium-core', version: '3.1.3.Final'

    // Test dependencies
    testImplementation project(path: ":sdks:java:core", configuration: "shadowTest")
    testImplementation project(path: ":sdks:java:io:common")
    testImplementation library.java.junit
    testImplementation project(path: ":sdks:java:io:jdbc")
    testRuntimeOnly library.java.slf4j_jdk14
    testRuntimeOnly project(path: ":runners:direct-java", configuration: "shadow")
    testImplementation project(":runners:google-cloud-dataflow-java")
    testImplementation library.java.hamcrest
    testImplementation library.java.testcontainers_base
    testImplementation "org.testcontainers:kafka"
    testImplementation "org.testcontainers:mysql"
    testImplementation "org.testcontainers:postgresql"
    testImplementation "io.debezium:debezium-testing-testcontainers:3.1.3.Final"
    testImplementation 'com.zaxxer:HikariCP:5.1.0'

    // Debezium connector implementations for testing
    testImplementation group: 'io.debezium', name: 'debezium-connector-mysql', version: '3.1.3.Final'
    testImplementation group: 'io.debezium', name: 'debezium-connector-postgres', version: '3.1.3.Final'
}

// Pin the Antlr version to 4.10
// and force Jackson versions to 2.17.1
// TODO: Remove pin after upgrading Beam's Jackson version
// This overrides the global 2.15.4 forced by BeamModulePlugin.
configurations.all {
    resolutionStrategy {
        force 'org.antlr:antlr4:4.10',
                'org.antlr:antlr4-runtime:4.10',
                'com.fasterxml.jackson.core:jackson-core:2.17.1',
                'com.fasterxml.jackson.core:jackson-annotations:2.17.1',
                'com.fasterxml.jackson.core:jackson-databind:2.17.1',
                'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1'
    }
}

def configureTestJvmArgs(Task task) {
    List<String> currentJvmArgs = task.jvmArgs ? new ArrayList<>(task.jvmArgs) : new ArrayList<>()

    // Add standard opens required for Jackson, Afterburner, and other reflective frameworks
    // when dealing with Java Modules or complex classloader scenarios.
    currentJvmArgs.addAll([
        '--add-opens=java.base/java.lang=ALL-UNNAMED',
        '--add-opens=java.base/java.util=ALL-UNNAMED',
        '--add-opens=java.base/java.util.concurrent=ALL-UNNAMED',
        '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED',
        '--add-opens=java.base/java.io=ALL-UNNAMED',
        '--add-opens=java.base/java.nio=ALL-UNNAMED',
        '--add-opens=java.base/java.math=ALL-UNNAMED',
        '--add-opens=java.base/java.time=ALL-UNNAMED', // For JSR310 types
    ])

    task.jvmArgs = currentJvmArgs.unique() // Assign the new, filtered list back, removing duplicates
    project.logger.lifecycle("Task ${task.name} final jvmArgs: ${task.jvmArgs.join(' ')}")
}

test {
    testLogging {
        outputs.upToDateWhen {false}
        showStandardStreams = true
        exceptionFormat = 'full'
    }
    configureTestJvmArgs(delegate)

}

task integrationTest(type: Test, dependsOn: processTestResources) {
  group = "Verification"
  systemProperty "beamTestPipelineOptions", JsonOutput.toJson([
          "--runner=DirectRunner",
  ])

  // Disable Gradle cache: these ITs interact with live service that should always be considered "out of date"
  outputs.upToDateWhen { false }

  include '**/*IT.class'
  classpath = sourceSets.test.runtimeClasspath
  testClassesDirs = sourceSets.test.output.classesDirs

  useJUnit {
  }
}
