/*
 * 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.16'
}

applyDockerNature()
applyGoNature()

evaluationDependsOn(":sdks:java:extensions:schemaio-expansion-service")
evaluationDependsOn(":sdks:java:io:expansion-service")
evaluationDependsOn(":sdks:java:io:google-cloud-platform:expansion-service")

description = "Apache Beam :: SDKs :: Java :: Expansion-service :: Container"

configurations {
    dockerDependency
    expansionServiceLauncher
}

dependencies {
    // TODO(https://github.com/apache/beam/issues/34098) remove when Beam moved to avro 1.12
    dockerDependency "org.apache.avro:avro:1.12.0"
    dockerDependency project(path: ":sdks:java:extensions:schemaio-expansion-service", configuration: "shadow")
    dockerDependency project(path: ":sdks:java:io:expansion-service", configuration: "shadow")
    dockerDependency project(path: ":sdks:java:io:google-cloud-platform:expansion-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
    // TODO(https://github.com/apache/beam/issues/34098) remove when Beam moved to avro 1.12
    rename 'avro-.*.jar', 'avro.jar'
    rename 'beam-sdks-java-extensions-schemaio-expansion-service-.*.jar', 'beam-sdks-java-extensions-schemaio-expansion-service.jar'
    rename 'beam-sdks-java-io-expansion-service-.*.jar', 'beam-sdks-java-io-expansion-service.jar'
    rename 'beam-sdks-java-io-google-cloud-platform-expansion-service-.*.jar', 'beam-sdks-java-io-google-cloud-platform-expansion-service.jar'
    setDuplicatesStrategy(DuplicatesStrategy.INCLUDE)
    into "build/target"
}

task copyConfigFile(type: Copy) {
    from "expansion_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 + "java_expansion_service",
            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
}
