import java.nio.charset.StandardCharsets

/**
 *  Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
 *
 *  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
 *
 *       https://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.
 */
buildscript {
    ext {
        depends = [
                baksmali       : 'com.github.iBotPeaches.smali:baksmali:403e90375e',
                commons_cli    : 'commons-cli:commons-cli:1.5.0',
                commons_io     : 'commons-io:commons-io:2.11.0',
                commons_lang   : 'org.apache.commons:commons-lang3:3.12.0',
                commons_text   : 'org.apache.commons:commons-text:1.10.0',
                guava          : 'com.google.guava:guava:31.0.1-jre',
                junit          : 'junit:junit:4.13.2',
                proguard_gradle: 'com.guardsquare:proguard-gradle:7.3.0',
                snakeyaml      : 'org.yaml:snakeyaml:1.32:android',
                smali          : 'com.github.iBotPeaches.smali:smali:403e90375e',
                xmlpull        : 'xpp3:xpp3:1.1.4c',
                xmlunit        : 'xmlunit:xmlunit:1.6',
        ]
    }

    repositories {
        gradlePluginPortal()
    }
    dependencies {
        classpath "gradle.plugin.com.github.johnrengelman:shadow:7.1.0"
        classpath "gradle.plugin.com.hierynomus.gradle.plugins:license-gradle-plugin:0.16.1"
    }
}

apply from: 'gradle/functions.gradle'

version = '2.7.0'
def suffix = ''

defaultTasks 'build', 'shadowJar', 'proguard'

allprojects {
    apply plugin: 'java'
    apply plugin: 'com.github.hierynomus.license'

    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    license {
        header rootProject.file("brut.j.common/src/templates/apache2.0-header.txt")
        exclude "**/android/content/res/*.java"
        exclude "**/android/util/*.java"
        include "**/*.java"
        mapping {
            java = 'SLASHSTAR_STYLE'
        }
        ext {
            year = '2010'
            brut = 'Ryszard Wiśniewski'
            brutEmail = 'brut.alll@gmail.com'
            ibot = 'Connor Tumbleson'
            ibotEmail = 'connor.tumbleson@gmail.com'
        }
        strictCheck true
    }

    // license plugin automatically fires these tasks, disable them and run them during releases
    gradle.startParameter.excludedTaskNames += [
            "licenseMain",
            "licenseTest"
    ]

    repositories {
        mavenCentral()

        // Obtain baksmali/smali from source builds - https://github.com/iBotPeaches/smali
        // Remove when official smali releases come out again.
        maven {
            url 'https://jitpack.io'
            content {
                includeGroup('com.github.iBotPeaches.smali')
            }
        }
    }
}

tasks.withType(JavaCompile).configureEach {
    options.encoding = StandardCharsets.UTF_8.toString()
    options.compilerArgs += ["-Xlint:-options"]
}

def mavenVersion = 'unspecified'
if (!('release' in gradle.startParameter.taskNames)) {
    def hash = getCheckedOutGitCommitHash()

    if (hash == null) {
        project.ext.set("hash", "dirty")
        project.ext.set("apktool_version", version + "-dirty")
        println "Building SNAPSHOT (no .git folder found)"
    } else {
        project.ext.set("hash", hash)
        project.ext.set("apktool_version", version + "-" + hash + "-SNAPSHOT")
        mavenVersion = version + "-SNAPSHOT"
        println "Building SNAPSHOT (${getCheckedOutBranch()}): $hash"
    }
} else {
    project.ext.set("hash", "")
    if (suffix.length() > 0) {
        project.ext.set("apktool_version", version + "-" + suffix)
    } else {
        project.ext.set("apktool_version", version)
    }
    mavenVersion = version
    println "Building RELEASE (${getCheckedOutBranch()}): $project.ext.apktool_version"
}

build.doFirst {
    def javaVersion = System.getProperty("java.version")

    // fail the build if java (1.5/1.6/1.7)
    if (javaVersion.startsWith("1.5") || javaVersion.startsWith("1.6") || javaVersion.startsWith("1.7")) {
        throw new GradleException("You can fix this problem!\n" +
                "We found a " + javaVersion + " JDK\n" +
                "Please update JAVA_HOME to use at least a 1.8 JDK\n" +
                "Currently it is set to: " + System.getProperty("java.home")
        )
    }
}

// used for official releases only. Please don't use
task release {
}

// used for publishing snapshot builds to maven.
task snapshot {
}

subprojects {
    apply plugin: 'java'

    test {
        testLogging {
            exceptionFormat = 'full'
        }
    }

    def mavenProjects = ['apktool-lib', 'apktool-cli', 'brut.j.common', 'brut.j.util', 'brut.j.dir']

    if (project.name in mavenProjects) {
        apply plugin: 'maven-publish'
        apply plugin: 'signing'

        publishing {
            publications {
                maven(MavenPublication) {
                    from project.components.java

                    groupId = 'org.apktool'
                    artifactId = project.name
                    version = mavenVersion

                    pom {
                        name = 'Apktool'
                        description = 'A tool for reverse engineering Android apk files.'
                        url = 'https://apktool.org'

                        licenses {
                            license {
                                name = 'The Apache License 2.0'
                                url = 'https://opensource.org/licenses/Apache-2.0'
                            }
                        }
                        developers {
                            developer {
                                id = 'iBotPeaches'
                                name = 'Connor Tumbleson'
                                email = 'connor.tumbleson@gmail.com'
                            }
                            developer {
                                id = 'brutall'
                                name = 'Ryszard Wiśniewski'
                                email = 'brut.alll@gmail.com'
                            }
                        }
                        scm {
                            connection = 'scm:git:git://github.com/iBotPeaches/Apktool.git'
                            developerConnection = 'scm:git:git@github.com:iBotPeaches/Apktool.git'
                            url = 'https://github.com/iBotPeaches/Apktool'
                        }
                    }
                }
            }
            if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
                repositories {
                    maven {
                        if (mavenVersion.endsWith('-SNAPSHOT')) {
                            url = 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
                        } else {
                            url = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
                        }
                        credentials {
                            username ossrhUsername
                            password ossrhPassword
                        }
                    }
                }
            }
        }

        signing {
            required { gradle.taskGraph.hasTask('publish') }
            sign(publishing.publications["maven"])
        }

        java {
            withJavadocJar()
            withSourcesJar()
        }

        tasks.getByPath(':release').dependsOn(publish)
        tasks.getByPath(':snapshot').dependsOn(publish)
    }
}
