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


apply plugin: 'org.apache.beam.module'

applyDockerNature()
applyGoNature()

description = "Apache Beam :: SDKs :: Java :: Transform Service :: Controller Container"

configurations {
    dockerDependency
}

dependencies {
    dockerDependency project(path: ":sdks:java:transform-service", configuration: "shadow")
}

goBuild {
    goTargets = '*.go' // only build the immediate directory.
    outputLocation = './build/target/launcher/${GOOS}_${GOARCH}/boot'
}

task copyDockerfileDependencies(type: Copy) {
    from configurations.dockerDependency
    rename 'beam-sdks-java-transform-service-.*.jar', 'beam-sdks-java-transform-service.jar'
    setDuplicatesStrategy(DuplicatesStrategy.INCLUDE)
    into "build/target"
}

task copyConfigFile(type: Copy) {
    from "../transform_service_config.yml"
    into "build/target"
}

def pushContainers = project.rootProject.hasProperty(["isRelease"]) || project.rootProject.hasProperty("push-containers")

docker {
    name containerImageName(
            name: project.docker_image_default_repo_prefix + "transform_service_controller",
            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)
    // tags used by dockerTag task
    tags containerImageTags()
    files "./build"
    buildx project.useBuildx()
    platform(*project.containerPlatforms())
    load project.useBuildx() && !pushContainers
    push pushContainers
}

dockerPrepare.dependsOn goBuild
dockerPrepare.dependsOn copyConfigFile
dockerPrepare.dependsOn copyDockerfileDependencies

if (project.rootProject.hasProperty(["docker-pull-licenses"])) {
    def copyGolangLicenses = tasks.register("copyGolangLicenses", Copy) {
        from "${project(':release:go-licenses:py').buildDir}/output"
        into "build/target/go-licenses"
        dependsOn ':release:go-licenses:py:createLicenses'
    }
    dockerPrepare.dependsOn copyGolangLicenses
} else {
    def skipPullLicenses = tasks.register("skipPullLicenses", Exec) {
        executable "sh"
        // Touch a dummy file to ensure the directory exists.
        args "-c", "mkdir -p build/target/go-licenses && touch build/target/go-licenses/skip"
    }
    dockerPrepare.dependsOn skipPullLicenses
}

task pushAll {
    dependsOn docker
}
