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

def pythonVersionSuffix = project.ext.pythonVersion.replace('.', '')

description = "Apache Beam :: SDKs :: Python :: Container :: Python ${pythonVersionSuffix} Container"

configurations {
  sdkSourceTarball
  pythonHarnessLauncher
}

dependencies {
  sdkSourceTarball project(path: ":sdks:python", configuration: "distTarBall")
  pythonHarnessLauncher project(path: ":sdks:python:container", configuration: "pythonHarnessLauncher")
}

def generatePythonRequirements = tasks.register("generatePythonRequirements") {
  dependsOn ':sdks:python:sdist'
  def pipExtraOptions = project.hasProperty("testRCDependencies") ? "--pre" : ""
  def runScriptsPath = "${rootDir}/sdks/python/container/run_generate_requirements.sh"
  doLast {
    exec {
      executable 'sh'
      args '-c', "cd ${rootDir} && ${runScriptsPath} " +
              "${project.ext.pythonVersion} " +
              "${files(configurations.sdkSourceTarball.files).singleFile} " +
              "base_image_requirements.txt " +
              "container " +
              "[gcp,dataframe,test,tfrecord,yaml] " +
              "${pipExtraOptions}"
    }
    // Generate versions for ML dependencies
    exec {
      executable 'sh'
      args '-c', "cd ${rootDir} && ${runScriptsPath} " +
              "${project.ext.pythonVersion} " +
              "${files(configurations.sdkSourceTarball.files).singleFile} " +
              "base_image_requirements.txt " +
              "container/ml " +
              "[gcp,dataframe,test,ml_cpu,tfrecord,yaml] " +
              "${pipExtraOptions}"
    }
    // TODO(https://github.com/apache/beam/issues/36637)
    // Skip generating Python 3.13 requirements for now since not all 3.13
    // wheels are available/buildable.
    // Also skip 3.9 because there are some dependency version conflicts. This
    // is fine since 3.9 will be EoL by the next release, and we can remove
    // this condition once we remove support entirely.
    if ("${project.ext.pythonVersion}" != "3.13" && "${project.ext.pythonVersion}" != "3.9") {
      // GPU requirements not used for any containers directly due to
      // licensing, but can be picked up by customers or other consumers for
      // use.
      exec {
        executable 'sh'
        args '-c', "cd ${rootDir} && ${runScriptsPath} " +
                "${project.ext.pythonVersion} " +
                "${files(configurations.sdkSourceTarball.files).singleFile} " +
                "gpu_image_requirements.txt " +
                "container/ml " +
                "[gcp,dataframe,test,tensorflow,tfrecord,torch,transformers,vllm] " +
                "${pipExtraOptions}"
      }
    }
  }
}

def copyDockerfileDependencies = tasks.register("copyDockerfileDependencies", Copy) {
  from configurations.sdkSourceTarball
  from file("base_image_requirements.txt")
  into "build/target"
  if(configurations.sdkSourceTarball.isEmpty()) {
      throw new StopExecutionException();
  }
}

def copyLicenseScripts = tasks.register("copyLicenseScripts", Copy){
  from ("../license_scripts")
  into "build/target/license_scripts"
}

def copyLauncherDependencies = tasks.register("copyLauncherDependencies", Copy) {
  from configurations.pythonHarnessLauncher
  into "build/target/launcher"

  // Avoid seemingly gradle bug stated in https://github.com/apache/beam/issues/29220
  mustRunAfter "copyLicenses"

  if(configurations.pythonHarnessLauncher.isEmpty()) {
      throw new StopExecutionException();
  }
}

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

docker {
  name containerImageName(
          name: project.docker_image_default_repo_prefix + "python${project.ext.pythonVersion}_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)
  // tags used by dockerTag task
  tags containerImageTags()
  files "../Dockerfile", "./build"
  buildArgs(['py_version': "${project.ext.pythonVersion}",
             'pull_licenses': project.rootProject.hasProperty(["docker-pull-licenses"]) ||
                     project.rootProject.hasProperty(["isRelease"])])
  buildx project.useBuildx()
  platform(*project.containerPlatforms())
  load project.useBuildx() && !pushContainers
  push pushContainers
}

dockerPrepare.dependsOn copyLauncherDependencies
dockerPrepare.dependsOn copyDockerfileDependencies
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
}
