import groovy.json.JsonOutput

/*
 * 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.
 */

plugins { id 'org.apache.beam.module' }

applyJavaNature(
  automaticModuleName: 'org.apache.beam.sdk.extensions.sql.meta.provider.hcatalog',
  // iceberg requires Java11+
  requireJavaVersion: JavaVersion.VERSION_11,
)

dependencies {
  implementation project(":sdks:java:extensions:sql")
  implementation project(":sdks:java:core")
  implementation project(":sdks:java:managed")
  implementation project(":sdks:java:io:iceberg")
  runtimeOnly project(":sdks:java:io:iceberg:bqms")
  runtimeOnly project(":sdks:java:io:iceberg:hive")
  // TODO(https://github.com/apache/beam/issues/21156): Determine how to build without this dependency
  provided "org.immutables:value:2.8.8"
  permitUnusedDeclared "org.immutables:value:2.8.8"
  implementation library.java.slf4j_api
  implementation library.java.vendored_guava_32_1_2_jre
  implementation library.java.vendored_calcite_1_40_0
  implementation library.java.jackson_databind

  testImplementation library.java.joda_time
  testImplementation library.java.junit
  testImplementation library.java.google_api_services_bigquery
  testImplementation "org.apache.iceberg:iceberg-api:1.9.2"
  testImplementation "org.apache.iceberg:iceberg-core:1.9.2"
  testImplementation project(":sdks:java:io:google-cloud-platform")
  testImplementation project(":sdks:java:extensions:google-cloud-platform-core")
}

task integrationTest(type: Test) {
  def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing'
  def gcsTempRoot = project.findProperty('gcsTempRoot') ?: 'gs://temp-storage-for-end-to-end-tests/'

  // Disable Gradle cache (it should not be used because the IT's won't run).
  outputs.upToDateWhen { false }

  def pipelineOptions = [
    "--project=${gcpProject}",
    "--tempLocation=${gcsTempRoot}",
    "--blockOnRun=false"]

  systemProperty "beamTestPipelineOptions", JsonOutput.toJson(pipelineOptions)

  include '**/*IT.class'

  maxParallelForks 4
  classpath = project(":sdks:java:extensions:sql:iceberg")
    .sourceSets
    .test
    .runtimeClasspath
  testClassesDirs = files(project(":sdks:java:extensions:sql:iceberg").sourceSets.test.output.classesDirs)
  useJUnit { }
}

configurations.all {
  // iceberg-core needs avro:1.12.0
  resolutionStrategy.force 'org.apache.avro:avro:1.12.0'
}
