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}"

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