/*
 * 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' }
applyGoNature()

description = "Apache Beam :: Runners :: Prism"
ext.summary = "Tasks related to executing the Prism Runner"

// jobPort Property optionally configures the Prism job_port flag.
def jobPort = findProperty("jobPort")

// jobPortFlag is Prism service's job management service port flag name.
def jobPortFlag = "job_port"

// buildTarget is the go build output target path for the Prism service.
def buildTarget = layout.buildDirectory.get().file("tmp/prism")

// modDir is the path containing the go.mod file.
def modDir = project.rootDir.toPath().resolve("sdks")

// prismDir is the directory containing the prism executable.
def prismDir = modDir.resolve("go/cmd/prism")
ext.set('buildTarget', buildTarget)

// Overrides the gradle build task to build the prism executable.
def buildTask = tasks.named("build") {
    // goPrepare is a task registered in applyGoNature.
    dependsOn("goPrepare")
    // Allow Go to manage the caching, not gradle.
    outputs.cacheIf { false }
    outputs.upToDateWhen { false }
    doLast {
        exec {
            workingDir = modDir
            executable = 'sh'
            args = ["-c", "${project.ext.goCmd} build -o $buildTarget $prismDir"]
        }
    }
}

tasks.register("runServer", Exec) {
    dependsOn(buildTask)
    group = "application"
    description = "Run the Prism server"

    List<String> command = new ArrayList<>()
    command.add(buildTarget.asFile.path)
    if (jobPort != null) {
        command.add("-$jobPortFlag=$jobPort" as String)
    }

    commandLine = command
}
