/*
 * Copyright (c) 2022, WSO2 LLC. (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 'java'
    id 'com.github.spotbugs'
    id 'checkstyle'
    id 'jacoco'
    id 'maven-publish'
}

description = 'Ballerina - Persist Java Native'

configurations {
    jacocoRuntime
}

dependencies {
    jacocoRuntime "org.jacoco:org.jacoco.agent:${jacoco.toolVersion}:runtime"

    checkstyle project(":checkstyle")
    checkstyle "com.puppycrawl.tools:checkstyle:${checkstylePluginVersion}"
    implementation group: 'org.ballerinalang', name: 'ballerina-lang', version: "${ballerinaLangVersion}"
    implementation group: 'org.ballerinalang', name: 'ballerina-runtime', version: "${ballerinaLangVersion}"
}

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

sourceCompatibility = JavaVersion.VERSION_21

jacoco {
    toolVersion = "0.8.10"
}

test {
    useTestNG() {
        suites 'src/test/resources/testng.xml'
    }
    testLogging.showStandardStreams = true
    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
        afterSuite { desc, result ->
            if (!desc.parent) { // will match the outermost suite
                def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
                def startItem = '|  ', endItem = '  |'
                def repeatLength = startItem.length() + output.length() + endItem.length()
                println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
            }
        }
    }
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    dependsOn test
    reports {
        xml.required = true
    }
}

spotbugsMain {
    def classLoader = plugins["com.github.spotbugs"].class.classLoader
    def SpotBugsConfidence = classLoader.findLoadedClass("com.github.spotbugs.snom.Confidence")
    def SpotBugsEffort = classLoader.findLoadedClass("com.github.spotbugs.snom.Effort")
    ignoreFailures = true
    effort = SpotBugsEffort.MAX
    reportLevel = SpotBugsConfidence.LOW
    reportsDir = file("$project.buildDir/reports/spotbugs")
    def excludeFile = file("${rootDir}/build-config/spotbugs-exclude.xml")
    if (excludeFile.exists()) {
        it.excludeFilter = excludeFile
    }
    reports {
        text.enabled = true
    }
}

spotbugsTest {
    enabled = false
}

task validateSpotbugs() {
    doLast {
        if (spotbugsMain.reports.size() > 0 &&
                spotbugsMain.reports[0].destination.exists() &&
                spotbugsMain.reports[0].destination.text.readLines().size() > 0) {
            spotbugsMain.reports[0].destination?.eachLine {
                println 'Failure: ' + it
            }
            throw new GradleException("Spotbugs rule violations were found.");
        }
    }
}

checkstyle {
    toolVersion "${checkstylePluginVersion}"
    configFile file("${rootDir}/build-config/checkstyle/build/checkstyle.xml")
    configProperties = ["suppressionFile": file("${rootDir}/build-config/checkstyle/build/suppressions.xml")]
}

tasks.withType(Checkstyle) {
    exclude '**/module-info.java'
}

spotbugsMain.finalizedBy validateSpotbugs
checkstyleMain.dependsOn ':checkstyle:downloadCheckstyleRuleFiles'
checkstyleTest.dependsOn ':checkstyle:downloadCheckstyleRuleFiles'

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId project.group
            artifactId "persist-native"
            version = project.version
            artifact jar
        }
    }

    repositories {
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/ballerina-platform/module-ballerina-persist")
            credentials {
                username = System.getenv("publishUser")
                password = System.getenv("publishPAT")
            }
        }
        maven {
            name = "WSO2Nexus"
            if(project.version.endsWith('-SNAPSHOT')) {
                url "https://maven.wso2.org/nexus/content/repositories/snapshots/"
            } else {
                url "https://maven.wso2.org/nexus/service/local/staging/deploy/maven2/"
            }
            credentials {
                username System.getenv("NEXUS_USERNAME")
                password System.getenv("NEXUS_PASSWORD")
            }
        }
    }
}

compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
        ]
        classpath = files()
    }
}
