boolean getBooleanValue(String environmentVariable, String projectProperty, boolean defaultValue) {
    String env = System.getenv(environmentVariable)
    if (env != null) {
        return !env.isEmpty();
    }
    return getBooleanValue(project, projectProperty, defaultValue);
}

boolean getBooleanValue(Project proj, String propertyName, boolean defaultValue) {
    if (proj.hasProperty(propertyName)) {
        String prop = (String) project.properties[propertyName]
        if (prop != null) {
            return Boolean.valueOf(prop);
        }
    } else {
        return defaultValue;
    }
}

/**
 * Helper build script that reads data binding variables and sets up the projects.
 */
def root = ext.dataBindingRootFolder
Properties databindingProperties = new Properties()
databindingProperties.load(new FileInputStream("${root}/databinding.properties"))

// load android gradle plugin's version file
apply from: "${root}/../buildSrc/base/version.gradle"
databindingProperties.version = ext.buildVersion
databindingProperties.androidPluginVersion=ext.buildVersion
databindingProperties.isIndependent = rootProject.name.equals("data-binding")
databindingProperties.compileSdkVersion = databindingProperties.compileSdkVersionStr.trim()

ext.dataBindingConfig = databindingProperties
databindingProperties.artifactOutFolder = "${root}/../../out/repo"
def addRemoteRepos = getBooleanValue(project, "addRemoteRepos", false)
ext.dataBindingConfig.addRemoteRepos = addRemoteRepos
def dataBindingConfig = ext.dataBindingConfig

def localRepositories = ["${root}/../../prebuilts/tools/common/offline-m2",
                         "${root}/../../prebuilts/gradle-plugin",
                         "${root}/../../prebuilts/tools/common/m2/repository",
                         "${root}/../../prebuilts/maven_repo/android",
                         databindingProperties.artifactOutFolder]
ext.dataBindingConfig.localRepositories = localRepositories
def addRepos(RepositoryHandler handler) {
    dataBindingConfig.localRepositories.each { repo ->
        handler.maven {
            url repo
        }
    }
    if (dataBindingConfig.addRemoteRepos) {
        handler.jcenter()
        handler.mavenCentral()
    }
}
ext.addRepos = this.&addRepos
subprojects {
    buildscript {
        addRepos(repositories)
    }
    repositories {
        addRepos(repositories)
    }
}

def enablePublishing(p, addJavadoc) {
    if (!dataBindingConfig.isIndependent) {
        p.apply from: "$dataBindingRootFolder/../buildSrc/base/publish.gradle"
        if (addJavadoc) {
            p.apply from: "$dataBindingRootFolder/../buildSrc/base/javadoc.gradle"
        }
    }
}
ext.enablePublishing = this.&enablePublishing
