/*
 * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed 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 'jacoco'
    id "com.github.johnrengelman.shadow"
    id "de.undercouch.download"
    id "net.researchgate.release"
}

def packageName = "graphql"

allprojects {
    group = project.group
    version = project.version

    apply plugin: 'checkstyle'
    apply plugin: 'maven-publish'

    repositories {
        mavenLocal()

        maven {
            url = 'https://maven.pkg.github.com/ballerina-platform/*'
            credentials {
                username System.getenv("packageUser")
                password System.getenv("packagePAT")
            }
        }

        maven {
            url = 'https://maven.wso2.org/nexus/content/repositories/releases/'
        }

        maven {
            url = 'https://maven.wso2.org/nexus/content/groups/wso2-public/'
        }

        maven {
            url = 'https://maven.wso2.org/nexus/content/repositories/orgballerinalang-1614'
        }

        maven {
            url = 'https://repo.maven.apache.org/maven2'
        }

        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }

    ext {
        snapshotVersion= '-SNAPSHOT'
        timestampedVersionRegex = '.*-\\d{8}-\\d{6}-\\w.*\$'
    }
}

subprojects {

    configurations {
        ballerinaStdLibs
        jbalTools
        dist {
            transitive true
        }
    }

    dependencies {
        /* JBallerina Tools */
        jbalTools("org.ballerinalang:jballerina-tools:${ballerinaLangVersion}") {
            transitive = false
        }

        /* Standard libraries */
        ballerinaStdLibs "io.ballerina.stdlib:constraint-ballerina:${stdlibConstraintVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:io-ballerina:${stdlibIoVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:time-ballerina:${stdlibTimeVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:url-ballerina:${stdlibUrlVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:crypto-ballerina:${stdlibCryptoVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:log-ballerina:${stdlibLogVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:os-ballerina:${stdlibOsVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:task-ballerina:${stdlibTaskVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:cache-ballerina:${stdlibCacheVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:file-ballerina:${stdlibFileVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:mime-ballerina:${stdlibMimeVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:uuid-ballerina:${stdlibUuidVersion}"
        ballerinaStdLibs "io.ballerina.lib:data.jsondata-ballerina:${stdlibDataJsonDataVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:auth-ballerina:${stdlibAuthVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:jwt-ballerina:${stdlibJwtVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:oauth2-ballerina:${stdlibOAuth2Version}"
        ballerinaStdLibs "io.ballerina.stdlib:http-ballerina:${stdlibHttpVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:websocket-ballerina:${stdlibWebsocketVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:graphql-ballerina:${stdlibGraphqlVersion}"
        ballerinaStdLibs "io.ballerina.stdlib:observe-ballerina:${observeVersion}"
        ballerinaStdLibs "io.ballerina:observe-ballerina:${observeInternalVersion}"
    }
}

def moduleVersion = project.version.replace("-SNAPSHOT", "")

release {
    // Disable check snapshots temporarily
    buildTasks = ['build']
    failOnPublishNeeded = false
    versionPropertyFile = 'gradle.properties'
    tagTemplate = 'v${version}'
    git {
        // To release from any branch
        requireBranch = "release-${moduleVersion}"
        pushToRemote = 'origin'
    }
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

task codeCoverageReport(type: JacocoReport) {
    dependsOn(":${packageName}-tool:build")

    executionData.setFrom(fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec"))

    def sourceDirs = files(
        "${project.rootDir}/${packageName}-cli/src/main/java",
        "${project.rootDir}/${packageName}-code-generator/src/main/java",
        "${project.rootDir}/${packageName}-schema-file-generator/src/main/java"
    )

    def classDirs = files(
        fileTree(dir: "${rootDir}/graphql-code-generator/build/classes/java/main/io/ballerina/graphql/generator"),
        fileTree(dir: "${rootDir}/graphql-schema-file-generator/build/classes/java/main/io/ballerina/graphql/schema")
    )

    sourceDirectories.setFrom(sourceDirs)
    classDirectories.setFrom(classDirs)

    reports {
        xml.required = true
        html.required = true
        csv.required = true
        xml.destination = file("${buildDir}/reports/jacoco/report.xml")
        html.destination = file("${buildDir}/reports/jacoco/report.html")
        csv.destination = file("${buildDir}/reports/jacoco/report.csv")
    }

    onlyIf = {
        true
    }
}

task build {
    dependsOn ":${packageName}-tool:build"
}

publish.dependsOn build
