/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import javax.tools.ToolProvider

apply plugin: 'java'
apply plugin: 'maven'

group = 'com.android'
version = '1.0.6'

def currentJvmVersion = org.gradle.api.JavaVersion.current()
if (currentJvmVersion.getMajorVersion() != "8") {
  throw new Exception("Unsupported java version '" + currentJvmVersion.toString() + "'. Please install java 8.\n" +
"\n" +
"If you have already installed java 8, you can instruct Gradle to use it by setting the environment variable JAVA_HOME equal to its file path.")
}

/*
 * With the build server you are given two env variables:
 * 1. The OUT_DIR is a temporary directory you can use to put things during the build.
 * 2. The DIST_DIR is where you want to save things from the build.
 *
 * The build server will copy the contents of DIST_DIR to somewhere and make it available.
 */
if (System.env.DIST_DIR != null && System.env.OUT_DIR != null) {
    buildDir = file("${System.env.OUT_DIR}/gradle/external/jdiff/build").getCanonicalFile()
    ext.distDir = file(System.env.DIST_DIR).getCanonicalFile()

    // The distDir is conveniently named after the build ID.
    version = "${version}.${ext.distDir.name}"
} else {
    buildDir = file('../../out/host/gradle/external/jdiff/build')
    ext.distDir = file('../../out/dist')

    // Local builds are not public release candidates.
    version = "${version}-SNAPSHOT"
}

/*
 * If prebuilts are available, use them. Else, if this is unbundled build use jcenter().
 * Finally, if none of that is true, attempt to compile against the full source trees.
 */
File m2repo = file('../../prebuilts/androidx/external')
boolean unbundleBuild = (new File("unbundled-build")).exists()

if (m2repo.exists() || unbundleBuild) {
    repositories {
        maven { url m2repo.absolutePath }
        if (unbundleBuild) {
            jcenter()
        }
    }

    dependencies {
        compile 'org.antlr:antlr:3.5.2'
        compile 'com.google.jsilver:jsilver:1.0.0'
        compile 'org.ccil.cowan.tagsoup:tagsoup:1.2.1'
        // Transitive dependency required by jsilver.
        compile 'com.google.guava:guava:15.0'
    }
} else {
    dependencies {
        compile project(path: ':antlr', configuration: 'antlrRuntime')
        compile project(':jsilver')
        compile project(':tagsoup')
    }
}


dependencies {
    testCompile 'junit:junit:4.12'

    // tools.jar required for com.sun.javadoc
    compile files(((URLClassLoader) ToolProvider.getSystemToolClassLoader()).getURLs())
}

sourceSets {
    main {
        java.srcDirs = ['src/']
        resources.srcDirs = ['res/']
    }
    test {
        java.srcDirs = ['test/']
        resources.srcDirs = ['test/api']
    }
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri("${buildDir}/repo"))
        }
    }
}

task dist(type: Zip, dependsOn: uploadArchives)  {
    group = BasePlugin.BUILD_GROUP
    description 'Builds distribution artifacts.'

    from uploadArchives.artifacts
    destinationDir distDir

    doLast {
        logger.lifecycle "Compressed maven artifacts to ${archivePath}"
    }
}
