/*
 * 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 'com.github.jk1.dependency-license-report' version '1.13'
}

applyGoNature()
applyDockerNature()

evaluationDependsOn(":sdks:java:harness")
evaluationDependsOn(":sdks:java:io:kafka")

description = "Apache Beam :: SDKs :: Java :: Container"

// Figure out why the golang plugin does not add a build dependency between projects.
// Without the line below, we get spurious errors about not being able to resolve
// "./github.com/apache/beam/sdks/go"
resolveBuildDependencies.dependsOn ":sdks:go:goBuild"

configurations {
  dockerDependency
}

dependencies {
  golang {
    // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
    // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
  }
  dockerDependency library.java.slf4j_api
  dockerDependency library.java.slf4j_jdk14
  dockerDependency project(path: ":sdks:java:harness", configuration: "shadow")
  // For executing KafkaIO, e.g. as an external transform
  dockerDependency project(":sdks:java:io:kafka")
  // This dependency is set to 'provided' scope in :sdks:java:io:kafka
  dockerDependency library.java.kafka_clients
}

def dockerfileName = project.findProperty('dockerfile') ?: 'Dockerfile'

task copyDockerfileDependencies(type: Copy) {
  from configurations.dockerDependency
  rename "slf4j-api.*", "slf4j-api.jar"
  rename "slf4j-jdk14.*", "slf4j-jdk14.jar"
  rename 'beam-sdks-java-harness-.*.jar', 'beam-sdks-java-harness.jar'
  rename 'beam-sdks-java-io-kafka.*.jar', 'beam-sdks-java-io-kafka.jar'
  rename 'kafka-clients.*.jar', 'kafka-clients.jar'
  into "build/target"
}


golang {
  packagePath = 'github.com/apache/beam/sdks/java/boot'
  goBuild {
    // TODO(herohde): build local platform + linux-amd64, if possible.
    targetPlatform = ['linux-amd64']
    outputLocation = './build/target/${GOOS}_${GOARCH}/boot'
  }
}

// command: ./gradlew generateLicenseReport
import com.github.jk1.license.render.*
licenseReport {
  projects = [project,
              project.rootProject.findProject(':sdks:java:harness'),
              project.rootProject.findProject(':sdks:java:io:kafka')]
  excludeOwnGroup = true
  excludeGroups = ["beam.*"] // project dependencies do not match their maven coords
  configurations = ALL
  renderers = [new JsonReportRenderer()]
}

docker {
  name containerImageName(
          name: project.docker_image_default_repo_prefix + "java_sdk",
          root: project.rootProject.hasProperty(["docker-repository-root"]) ?
                  project.rootProject["docker-repository-root"] :
                  project.docker_image_default_repo_root,
          tag: project.rootProject.hasProperty(["docker-tag"]) ?
                  project.rootProject["docker-tag"] : project.sdk_version)
  dockerfile project.file("./${dockerfileName}")
  files "./build/"
  buildArgs(['pull_licenses': project.rootProject.hasProperty(["docker-pull-licenses"]) ||
                     project.rootProject.hasProperty(["isRelease"])])
}

task pullLicenses(type: Exec) {
  commandLine './license_scripts/license_script.sh'
  outputs.dir('build/target/third_party_licenses')
  outputs.dir('build/target/java_third_party_licenses')
}
pullLicenses.dependsOn generateLicenseReport
generateLicenseReport.outputs.cacheIf { false }

task copyGolangLicenses(type: Copy) {
  from "${project(':release:go-licenses:java').buildDir}/output"
  into "build/target/go-licenses"
  dependsOn ':release:go-licenses:java:createLicenses'
}

task skipPullLicenses(type: Exec) {
  executable "sh"
  args "-c", "mkdir -p build/target/third_party_licenses && touch build/target/third_party_licenses/skip"
}

if (project.rootProject.hasProperty(["docker-pull-licenses"]) ||
        project.rootProject.hasProperty(["isRelease"])) {
  dockerPrepare.dependsOn pullLicenses
  dockerPrepare.dependsOn copyGolangLicenses
} else {
  dockerPrepare.dependsOn skipPullLicenses
}

// Ensure that we build the required resources and copy and file dependencies from related projects
dockerPrepare.dependsOn goBuild
dockerPrepare.dependsOn copyDockerfileDependencies
