/*
 * Copyright (c) 2021, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * WSO2 Inc. 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.
 */

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'java'

description = 'Ballerina - gRPC Examples'

def ballerinaDist = "${project.rootDir}/target/ballerina-runtime"
def examples = [
    "route-guide/server",
    "route-guide/client",
    "online-boutique-microservice/product-catalog-service",
    "online-boutique-microservice/ad-service",
    "online-boutique-microservice/recommendation-service",
    "program-analyzer/server",
    "program-analyzer/client"
]

dependencies {
    implementation group: 'org.ballerinalang', name: 'ballerina-lang', version: "${ballerinaLangVersion}"
    implementation group: 'org.ballerinalang', name: 'ballerina-tools-api', version: "${ballerinaLangVersion}"
    implementation group: 'org.ballerinalang', name: 'ballerina-parser', version: "${ballerinaLangVersion}"
    implementation group: 'org.testng', name: 'testng', version: "${testngVersion}"
}

task testExamples {
    doLast {
        def moduleVersion = "${project.version}".replace("-SNAPSHOT", "")
        examples.each { example ->
            def exampleDirectory = "${project.projectDir}/${example}"
            try {
                exec {
                    workingDir exampleDirectory
                    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                        commandLine 'cmd', '/c', "${ballerinaDist}/bin/bal.bat test --offline && exit %%ERRORLEVEL%%"
                    } else {
                        commandLine 'sh', '-c', "${ballerinaDist}/bin/bal test --offline"
                    }
                }
            } catch (Exception e) {
                println("Example '${example}' Build failed: " + e.message)
                throw e
            }
        }
    }
}

task buildExamples {
    gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(":grpc-examples:test")) {
            buildExamples.enabled = false
        } else {
            testExamples.enabled = false
        }
    }
    doLast {
        def moduleVersion = "${project.version}".replace("-SNAPSHOT", "")
        examples.each { example ->
            try {
                exec {
                    workingDir project.projectDir
                    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                        commandLine 'cmd', '/c', "${ballerinaDist}/bin/bal.bat build ${example} && exit %%ERRORLEVEL%%"
                    } else {
                        commandLine 'sh', '-c', "${ballerinaDist}/bin/bal build ${example}"
                    }
                }
            } catch (Exception e) {
                println("Example '${example}' Build failed: " + e.message)
                throw e
            }
        }
    }
}

testExamples.dependsOn ":grpc-ballerina:build"
buildExamples.dependsOn ":grpc-ballerina:build"
test.dependsOn testExamples
build.dependsOn buildExamples
