plugins {
    id 'java'
    id 'checkstyle'
    id "com.github.jk1.dependency-license-report" version "1.14"
    id 'com.github.sherter.google-java-format' version '0.9'
    id "com.github.spotbugs" version "4.4.2"
    id "com.jfrog.artifactory" version "4.15.2"
    id "net.ltgt.apt" version "0.21"
    id "net.ltgt.errorprone" version "1.2.1"
}

/*
 * When you check a version of the library, place the date that you checked it next to the library.
 * TODOs indicate who has context for the upgrade and any reasons it may be delayed, not necessarily
 * who should perform it.
**/
ext.libVersions = [
    // Core Libraries
    "guava": "29.0-jre", // 22 June 2020
    "guice": "4.2.3", // 22 June 2020

    // Logging
    "flogger": "0.5.1", // 22 June 2020
    "logback": "1.2.3", // 16 January 2020
    "slf4j": "1.7.30", // 16 January 2020

    // Client Libraries
    "httpClient": "4.5.12", // 22 June 2020

    // Build Utilities
    "errorprone":"2.4.0", // 22 June 2020
    "errorproneJavacVersion":"9+181-r4173-1", // 22 June 2020
    "jacoco": "0.8.5", // 22 June 2020
    "spotbugs": "4.0.4", // 22 June 2020

    // Test
    "junit": "4.13", // 22 June 2020
    "mockito": "3.3.3", // 22 June 2020
    "assertj": "3.16.1", // 26 June 2020

    // Command Line Utility Libraries
    "jcommander": "1.78", // 22 June 2020

    // OpenAPI Libraries
    "openapiParser": "1.0.1", // 23 June 2020
    "openapiCore": "1.0.1" // 23 June 2020
]

allprojects {
    apply plugin: 'checkstyle'
    apply plugin: 'idea'
    apply plugin: 'jacoco'
    apply plugin: 'java'

    apply plugin: "com.github.jk1.dependency-license-report"
    apply plugin: 'com.github.sherter.google-java-format'
    apply plugin: "com.github.spotbugs"
    apply plugin: 'net.ltgt.apt-idea'
    apply plugin: "net.ltgt.errorprone"

    sourceCompatibility = 11
    targetCompatibility = 11

    googleJavaFormat {
        toolVersion = '1.7'
    }

    repositories {
        mavenCentral()
        jcenter()
    }

    dependencies {
        checkstyle 'com.puppycrawl.tools:checkstyle:8.24'
        errorproneJavac("com.google.errorprone:javac:${libVersions.errorproneJavacVersion}")
        errorprone "com.google.errorprone:error_prone_core:${libVersions.errorprone}"

        implementation "com.google.flogger:flogger:${libVersions.flogger}"
        implementation "com.google.guava:guava:${libVersions.guava}"
        implementation "com.google.inject:guice:${libVersions.guice}"

        //testCompile project(':oas-test')

        //testImplementation "junit:junit:${libVersions.junit}"
        //testImplementation "org.mockito:mockito-core:${libVersions.mockito}"
    }

    checkstyle {
        configFile = file("$rootDir/config/checkstyle/checkstyle.xml")
    }

    checkstyleMain {
        logging.setLevel(LogLevel.LIFECYCLE)
    }

    checkstyleTest {
        logging.setLevel(LogLevel.LIFECYCLE)
    }

    group 'com.apigee.security.oas'
    version '1.0-SNAPSHOT'


    spotbugs {
        toolVersion = libVersions.spotbugs
        // TODO(ttourani): Create spotbugs-exclude.xml
        //excludeFilter = file("$rootDir/spotbugs-exclude.xml")
        effort = "max"
        reportLevel = "low"
    }

    tasks.withType(JavaCompile).configureEach {
        options.errorprone {
            disableWarningsInGeneratedCode = true
            allDisabledChecksAsWarnings = true
            error("Var")
            disable("AndroidJdkLibsChecker")
            disable("StaticOrDefaultInterfaceMethod")
            disable("Java7ApiChecker")
            excludedPaths = ".*/build/generated/.*" // Required due to https://github.com/google/error-prone/issues/1165
        }
    }

    jacoco {
        toolVersion = libVersions.jacoco
    }

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

    }

    jacocoTestCoverageVerification {
        violationRules {
            rule {
                limit {
                    minimum = 0.90
                }

                limit {
                    counter="BRANCH"
                    minimum = 0.90
                }
            }
        }
    }

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Werror"
        }
    }

    licenseReport {
        configurations = ['runtimeClasspath']
    }

    jacocoTestCoverageVerification.dependsOn jacocoTestReport

    jacocoTestReport.mustRunAfter check
    jacocoTestReport.mustRunAfter test

    build.dependsOn jacocoTestReport

    jacocoTestCoverageVerification.mustRunAfter build
}

subprojects {
    apply plugin: 'distribution'
    apply plugin: 'net.ltgt.apt'

    idea {
        module {
            // Marks the already(!) added srcDir as "generated"
            generatedSourceDirs += file('build/generated/sources/annotationProcessor/java')
        }
    }

    build.dependsOn check
    build.dependsOn distTar
}

defaultTasks 'build'