/*
 * 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
    // Skip for 3.14 since there isn't a tensorflow release that supports it
    // yet.
    if ("${project.ext.pythonVersion}" != "3.14") {
      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 and 3.14 requirements for now since not all 3.13
    // and 3.14 wheels are available/buildable.
    if ("${project.ext.pythonVersion}" != "3.13" && "${project.ext.pythonVersion}" != "3.14") {
      // 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
}
