/*
 * 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'
apply plugin: 'base'
apply from: "$project.rootDir/playground/backend/containers/git-functions.gradle"
applyDockerNature()

def playgroundJobServerProject = "${project.path.replace('-container', '')}"
def default_beam_version = "2.44.0"
description = project(playgroundJobServerProject).description + " :: Container"

configurations {
   dockerDependency
}

dependencies {
   dockerDependency project(path: playgroundJobServerProject, configuration: "shadow")
}

task copyKafkaEmulator(type: Copy) {
   dependsOn(":playground:kafka-emulator:distTar")
   from project(":playground:kafka-emulator").buildDir.path + "/distributions/kafka-emulator.tar"
   into 'build/kafka-emulator/'
}

task copyDockerfileDependencies {
   dependsOn("copyKafkaEmulator")

   doLast {
      copy {
         from '../../../backend/'
         into 'build/src'
         exclude 'containers'
      }
      copy {
         from 'entrypoint.sh'
         into 'build/'
      }
      copy {
         from '../../../playground'
         into 'build/playground'
      }
      copy {
         from '../../../../learning/katas/python'
         into 'build/katas'
      }
   }
}

docker {
   name containerImageName(
         name: project.docker_image_default_repo_prefix + "playground-backend-python",
         root: project.rootProject.hasProperty(["docker-repository-root"]) ?
               project.rootProject["docker-repository-root"] :
               project.docker_image_default_repo_root)
   files "./build/"
   tags containerImageTags()
   buildArgs(
         ['GO_BASE_IMAGE': project.rootProject.hasProperty(["go-base-image"]) ?
               project.rootProject["go-base-image"] :
               "golang:1-bullseye",
          'SDK_TAG'      : project.rootProject.hasProperty(["sdk-tag"]) ?
                project.rootProject["sdk-tag"] : default_beam_version,
          'GIT_COMMIT'   : getGitCommitHash(),
          'GIT_TIMESTAMP': getGitCommitTimestamp()])
}

// Ensure that we build the required resources and copy and file dependencies from related projects
dockerPrepare.dependsOn copyDockerfileDependencies
