apply plugin: "jacoco"

def jacocoCoverageAggregate = "$buildDir/jacoco/jacocoTestAll.exec"

def testedProjects() {
    subprojects.findAll { subproject -> subproject.plugins.hasPlugin('java') || subproject.plugins.hasPlugin('kotlin') }
}
gradle.projectsEvaluated {
    configure(testedProjects()) {
        apply plugin: "jacoco"

        jacoco {
            toolVersion = '0.8.4'
        }

        test {
            reports {
                junitXml.enabled = true
                html.enabled = false
            }

            jacoco {
                append = false
                destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
                classDumpDir = file("$buildDir/jacoco/classpathdumps")
            }
        }
    }

    task jacocoMerge(type: JacocoMerge) {
        destinationFile = file(jacocoCoverageAggregate)
        executionData = project.fileTree(dir: '.', include: '**/build/jacoco/jacocoTest.exec')

        dependsOn(getTasksByName('test', true))
    }


    task jacocoReport(type: JacocoReport) {
        sourceDirectories = files()
        classDirectories = files()
        executionData = files()

        reports {
            html.enabled = true
            xml.enabled = true
            csv.enabled = false
        }

        // Work-around to allow us to build list of executionData files in doFirst
        onlyIf = {
            true
        }

        /*
     * Builds list of source dirs, class dirs, and executionData files
     * when task is run, not at script evaluation time
     */
        doFirst {
            subprojects.findAll { subproject ->
                subproject.pluginManager.hasPlugin('java') || subproject.pluginManager.hasPlugin('kotlin')
            }.each { subproject ->
                additionalSourceDirs files((Set<File>) subproject.sourceSets.main.allSource.srcDirs)
                additionalClassDirs((FileCollection) subproject.sourceSets.main.output)
            }

            executionData = files(jacocoCoverageAggregate)
        }

        dependsOn(jacocoMerge)
    }

    sonarqube {
        properties {
            property "sonar.organization", "apollo-rsps"
            property "sonar.projectKey", "apollo:org.apollo"
            property "sonar.projectName", "Apollo RSPS"
            property "sonar.kotlin.file.suffixes", ".kt,.kts"
            property "sonar.jacoco.reportPaths", jacocoCoverageAggregate
        }
    }
}
