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

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()]
}

def imageJavaVersion = project.hasProperty('imageJavaVersion') ? project.findProperty('imageJavaVersion') : '8'
docker {
  name containerImageName(
          name: "${project.docker_image_default_repo_prefix}java${imageJavaVersion}_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("./Dockerfile")
  files "./build/"
  buildArgs([
    'pull_licenses': project.rootProject.hasProperty(["docker-pull-licenses"]) ||
                     project.rootProject.hasProperty(["isRelease"]),
    'java_version': imageJavaVersion,
  ])
}

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
