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'
  id 'application'
}
applyJavaNature( automaticModuleName: 'org.apache.beam.sdk.extensions.sql.jdbc',
  exportJavadoc: false,
  testShadowJar: true,
  validateShadowJar: false,
  shadowClosure: {}
)

configurations {
  integrationTest
}

dependencies {
  implementation project(":sdks:java:extensions:sql")
  implementation "jline:jline:2.14.6"
  permitUnusedDeclared "jline:jline:2.14.6" // BEAM-11761
  implementation "sqlline:sqlline:1.4.0"
  implementation library.java.vendored_calcite_1_40_0
  permitUnusedDeclared library.java.vendored_calcite_1_40_0
  testImplementation project(path: ":sdks:java:core", configuration: "shadow")
  testImplementation project(path: ":sdks:java:io:google-cloud-platform")
  testImplementation project(path: ":sdks:java:extensions:google-cloud-platform-core")
  testImplementation library.java.jackson_databind
  testImplementation library.java.joda_time
  testImplementation library.java.junit
  testImplementation library.java.vendored_guava_32_1_2_jre
  // Depending on outputs so integrationTest can run with only test dependencies.
  // This enables us to test the JDBC jar being loaded on a custom classloader.
  integrationTest sourceSets.test.output
  integrationTest sourceSets.main.output
  integrationTest library.java.junit

  if (project.hasProperty("beam.sql.shell.bundled")) {
    project.getProperty("beam.sql.shell.bundled").tokenize(",").each {
      subproject ->
        implementation project(path: subproject)
        permitUnusedDeclared project(path: subproject)
    }
  }
}

processResources {
  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
          'beam.version': version,
  ]
}

shadowJar {
  manifest {
    attributes "Main-Class": "org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLine"
  }
}

test {}

task shadowJarTest(type: Test, dependsOn: ":sdks:java:extensions:sql:jdbc:shadowJar") {
  group = "Verification"

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

  systemProperty "driver.jar", configurations.shadowTestRuntimeClasspath[1]

  include '**/JdbcJarTest.class'
  classpath = configurations.integrationTest
  useJUnit { }
}

task endToEndTest(type: Test) {
  group = "Verification"

  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'
  classpath = project(":sdks:java:extensions:sql:jdbc").sourceSets.test.runtimeClasspath
  testClassesDirs = files(project(":sdks:java:extensions:sql:jdbc").sourceSets.test.output.classesDirs)
  useJUnit { }
}

/* Define a common precommit task which depends on all the individual precommits. */
task preCommit() {
  dependsOn "shadowJarTest"
}

/* Define a postcommit task which depends on integration tests. */
task postCommit {
  group = "Verification"
  description = "Various integration tests"
  dependsOn endToEndTest
}

processResources {
  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
          'beam.version': version,
  ]
}

/**
 * Gradle console will interfere with SQL shell, so to run this command
 * we need to configure it:
 *  - disable daemon with '--no-daemon';
 *  - decrease verbosity with '--console plain';
 *  - quiet it with '-q';
 *
 * So, correct gradle invocation to start the SQL shell
 * looks something like this:
 *
 *   ./gradlew :sdks:java:extensions:sql:jdbc:run --console plain -q --no-daemon
 *
 * To add extra Beam project, set subproject property like
 * `-Pbeam.sql.shell.bundled="sdks:java:extensions:sql:hcatalog"`
 */
run {
  mainClassName = "org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLine"
  standardInput System.in
}
