/*
 * 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 'base'
  id 'org.apache.beam.module'
}
applyDockerNature()
applyPythonNature()
applyGoNature()

configurations {
  dockerDependency
}

dependencies {
 dockerDependency project(path: ":sdks:python", configuration: "distTarBall")
}

task copyDockerfileDependencies(type: Copy) {
    from configurations.dockerDependency
    rename 'apache-beam.*tar.gz', 'apache-beam-sdk.tar.gz'
    setDuplicatesStrategy(DuplicatesStrategy.INCLUDE)
    into "build/target"
}

task copyRequirementsFile(type: Copy) {
    def pythonVersionSuffix = project.ext.pythonVersion.replace('.', '')
    from project(":sdks:python:container:py${pythonVersionSuffix}").fileTree("./")
    include 'base_image_requirements.txt'
    rename 'base_image_requirements.txt', 'requirements.txt'
    setDuplicatesStrategy(DuplicatesStrategy.INCLUDE)
    into "build/target"
}

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

def copyLicenseScripts = tasks.register("copyLicenseScripts", Copy){
    from project(':sdks:python:container').fileTree("./license_scripts")
    into "build/target/license_scripts"
}

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

docker {
  name containerImageName(
          name: project.docker_image_default_repo_prefix + "python_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"
  buildArgs(['py_version': "${project.ext.pythonVersion}"])
  buildx project.useBuildx()
  platform(*project.containerPlatforms())
  load project.useBuildx() && !pushContainers
  push pushContainers
}

dockerPrepare.dependsOn goBuild
dockerPrepare.dependsOn copyDockerfileDependencies
dockerPrepare.dependsOn copyRequirementsFile
dockerPrepare.dependsOn copyLicenseScripts

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
}
