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'