/*
 * Copyright (c) 2025, WSO2 LLC. (http://www.wso2.org)
 *
 * WSO2 LLC. 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 'java'
    id 'checkstyle'
    id 'com.github.spotbugs'
}

description = 'Ballerina - JWT Compiler Plugin Tests'

dependencies {
    checkstyle project(':checkstyle')
    checkstyle "com.puppycrawl.tools:checkstyle:${checkstylePluginVersion}"

    implementation project(':jwt-compiler-plugin')

    testImplementation group: 'org.ballerinalang', name: 'ballerina-lang', version: "${ballerinaLangVersion}"
    testImplementation group: 'org.ballerinalang', name: 'ballerina-tools-api', version: "${ballerinaLangVersion}"
    testImplementation group: 'org.ballerinalang', name: 'ballerina-parser', version: "${ballerinaLangVersion}"
    testImplementation group: 'io.ballerina.scan', name: 'scan-command', version: "${balScanVersion}"
    testImplementation group: 'io.ballerina.scan', name: 'scan-command-test-utils', version: "${balScanVersion}"
    testImplementation group: 'org.testng', name: 'testng', version: "${testngVersion}"
    testImplementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jacksonDatabindVersion}"
}
tasks.withType(JavaCompile).configureEach {
    options.encoding = 'UTF-8'
}

sourceCompatibility = JavaVersion.VERSION_21

test {
    systemProperty "ballerina.offline.flag", "true"
    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))
            }
        }
    }
}

spotbugsTest {
    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
    }
}

spotbugsMain {
    enabled false
}

tasks.register('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.");
        }
    }
}

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

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

checkstyleMain {
    enabled false
}

spotbugsTest.finalizedBy validateSpotbugs
checkstyleTest.dependsOn ':checkstyle:downloadCheckstyleRuleFiles'

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

test.dependsOn ":jwt-ballerina:build"
build.dependsOn ":jwt-ballerina:build"
