apply plugin: 'maven-publish'
apply plugin: 'java-library'
apply plugin: 'jacoco'

def baseArtifactId = project.baseId
def artifactGroupId = project.groupId
def javaBaseName = "_GROUP_edu_wpi_first_${project.baseId}_ID_${project.baseId}-java_CLS"

def outputsFolder = file("$project.buildDir/outputs")

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

task outputJar(type: Jar, dependsOn: classes) {
    archiveBaseName = javaBaseName
    destinationDirectory = outputsFolder
    from sourceSets.main.output
}

task outputSourcesJar(type: Jar, dependsOn: classes) {
    archiveBaseName = javaBaseName
    destinationDirectory = outputsFolder
    classifier = 'sources'
    from sourceSets.main.allSource
}

task outputJavadocJar(type: Jar, dependsOn: javadoc) {
    archiveBaseName = javaBaseName
    destinationDirectory = outputsFolder
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives sourcesJar
    archives javadocJar
    archives outputJar
    archives outputSourcesJar
    archives outputJavadocJar
}

addTaskToCopyAllOutputs(outputSourcesJar)
addTaskToCopyAllOutputs(outputJavadocJar)
addTaskToCopyAllOutputs(outputJar)

build.dependsOn outputSourcesJar
build.dependsOn outputJavadocJar
build.dependsOn outputJar

project(':').libraryBuild.dependsOn build

publishing {
    publications {

        java(MavenPublication) {
            artifact jar
            artifact sourcesJar
            artifact javadocJar

            artifactId = "${baseArtifactId}-java"
            groupId artifactGroupId
            version wpilibVersioning.version.get()
        }
    }
}

test {
    useJUnitPlatform()
    systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true'
    testLogging {
        events "failed"
        exceptionFormat "full"
    }
    finalizedBy jacocoTestReport
}

if (project.hasProperty('onlylinuxathena') || project.hasProperty('onlylinuxraspbian') || project.hasProperty('onlylinuxaarch64bionic')) {
    test.enabled = false
}

repositories {
    mavenCentral()
    //maven.url "https://oss.sonatype.org/content/repositories/snapshots/"
}

sourceSets {
    dev
}

tasks.withType(JavaCompile).configureEach {
    options.compilerArgs = [
        '--release',
        '11',
        '-encoding',
        'UTF8'
    ]
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'

    devImplementation sourceSets.main.output
}

task run(type: JavaExec) {
    classpath = sourceSets.dev.runtimeClasspath

    mainClass = project.devMain
}

build.dependsOn devClasses

jacoco {
    toolVersion = "0.8.7"
}

jacocoTestReport {
    reports {
        xml.required = true
        html.required = true
    }
}
