apply plugin: 'jacoco'

jacoco {
    toolVersion = "$jacoco_version"
}

// Force Jacoco Version

subprojects {
    configurations.all {
        resolutionStrategy {
            eachDependency { details ->
                if ('org.jacoco' == details.requested.group) {
                    details.useVersion "$jacocoVersion"
                }
            }
        }
    }
}

project.afterEvaluate { project ->

    tasks.withType(Test) {
        jacoco.includeNoLocationClasses = true
        jacoco.excludes = ['jdk.internal.*']
    }

    final flavor = "Gplay"
    final buildType = "Debug"
    final variant = "$flavor${buildType.capitalize()}"
    final taskName = "jacocoTest${variant.capitalize()}UnitTestReport"

    task "$taskName"(type: JacocoReport, dependsOn: "test${variant.capitalize()}UnitTest") {

        reports {
            csv.required = Boolean.FALSE
            xml.required = Boolean.TRUE
            html.required = Boolean.TRUE
        }

        final fileFilter = [
                // data binding
                '**/databinding/*',
                'android/databinding/**/*.class',
                '**/android/databinding/*Binding.class',
                '**/android/databinding/*',
                '**/androidx/databinding/*',
                '**/BR.*',
                // android
                '**/R.class',
                '**/R$*.class',
                '**/BuildConfig.*',
                '**/Manifest*.*',
                '**/*Test*.*',
                'android/**/*.*',
                // kotlin
                '**/*MapperImpl*.*',
                '**/*$ViewInjector*.*',
                '**/*$ViewBinder*.*',
                '**/BuildConfig.*',
                '**/*Component*.*',
                '**/*BR*.*',
                '**/Manifest*.*',
                '**/*$Lambda$*.*',
                '**/*Companion*.*',
                '**/*Module*.*',
                '**/*Dagger*.*',
                '**/*Hilt*.*',
                '**/*MembersInjector*.*',
                '**/*_MembersInjector.class',
                '**/*_Factory*.*',
                '**/*_Provide*Factory*.*',
                '**/*Extensions*.*',
                // sealed and data classes
                '**/*$Result.*',
                '**/*$Result$*.*',
                // adapters generated by moshi
                '**/*JsonAdapter.*',
                // Hilt
                '**/*Module.kt',
                '**/di/**',
                'dagger.hilt.internal/*',
                'hilt_aggregated_deps/*',

                '**/*$Result.*', /* filtering `sealed` and `data` classes */
                '**/*$Result$*.*',/* filtering `sealed` and `data` classes */
                '**/*Args*.*', /* filtering Navigation Component generated classes */
                '**/*Directions*.*', /* filtering Navigation Component generated classes */
                '**/*inlined*.class', /* filtering inlined classes */
                '**/composables/**'
                /* INSERT ANY OTHER JUNK YOU WANT FILTERED OUT HERE */
        ]

        final androidKotlinTree = fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${variant}", excludes: fileFilter)
        final kotlinTree = fileTree(dir: "${project.buildDir}/classes/kotlin/main", excludes: fileFilter)
        final javacTree = fileTree(dir: "${project.buildDir}/intermediates/javac/${variant}/classes", excludes: fileFilter)

        final mainSrc = "${project.projectDir}/src/main/java"
        final productFlavorSrc = "${project.projectDir}/src/${flavor}/java"
        final buildTypeSrc = "${project.projectDir}/src/${buildType}/java"

        sourceDirectories.setFrom files([mainSrc, productFlavorSrc, buildTypeSrc])
        classDirectories.setFrom files([androidKotlinTree, kotlinTree, javacTree])
        executionData.setFrom fileTree(dir: project.buildDir, includes: [
                "jacoco/test${variant.capitalize()}UnitTest.exec",
                "outputs/unit_test_code_coverage/${variant}UnitTest/test${variant.capitalize()}UnitTest.exec",
        ])
    }
}
