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
    "floggerBackend": "0.5.1", // 25 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

    // Helper Libraries
    "apacheCommonsValidator": "1.4.0", // 25 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
    "openapiSchemaValidator": "1.0.2" // 7 July 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.flogger:flogger-system-backend:${libVersions.floggerBackend}"
        implementation "com.google.guava:guava:${libVersions.guava}"
        implementation "com.google.inject:guice:${libVersions.guice}"
        implementation "commons-validator:commons-validator:${libVersions.apacheCommonsValidator}"
    }

    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
        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'