/*
 * Copyright (c) 2015 FUJI Goro (gfx).
 *
 * 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 java.util.regex.Pattern

static int parseVersionName(String versionName) {
    final versionParts = versionName.split(/\D/)
    final major = versionParts[0].toInteger()
    final minor = versionParts[1].toInteger()
    final patchLevel = versionParts[2].toInteger()

    return major * (1000 * 1000) + minor * 1000 + patchLevel;
}

void updateReadme(String oldVersion, String newVersion) {
    def template = rootProject.file('README.md').text
    def result = template.replaceAll(Pattern.quote(oldVersion), newVersion)
    rootProject.file("README.md").withWriter { it << result }
}

rootProject.ext {
    versionFile = rootProject.file("VERSION")
    versionName = versionFile.readLines()[0].trim()
    versionCode = parseVersionName(versionName)
}


task bumpMajor {
    doLast {
        def oldVersion = rootProject.ext.versionName
        def versionParts = oldVersion.split(/\./)
        versionParts[0] = (versionParts[0] as int) + 1
        def newVersion = "${versionParts[0]}.0.0"
        versionFile.write(newVersion + "\n")
        updateReadme(oldVersion, newVersion)
        rootProject.ext.versionName = newVersion
        tasks.version.execute()
    }
}

task bumpMinor {
    doLast {
        def oldVersion = rootProject.ext.versionName
        def versionParts = oldVersion.split(/\./)
        versionParts[1] = (versionParts[1] as int) + 1
        def newVersion = "${versionParts[0]}.${versionParts[1]}.0"
        versionFile.write(newVersion + "\n")
        updateReadme(oldVersion, newVersion)
        rootProject.ext.versionName = newVersion
        tasks.version.execute()
    }
}

task bumpPatch {
    doLast {
        def oldVersion = rootProject.ext.versionName
        def versionParts = oldVersion.split(/\./)
        versionParts[2] = (versionParts[2].split(/\D/)[0] as int) + 1
        def newVersion = "${versionParts[0]}.${versionParts[1]}.${versionParts[2]}"
        versionFile.write(newVersion + "\n")
        updateReadme(oldVersion, newVersion)
        rootProject.ext.versionName = newVersion
        tasks.version.execute()
    }
}

task version {
    doLast {
        println "v" + rootProject.ext.versionName
    }
}

String shell(String command) {
    def proc = ["sh", "-c", "cd ${rootProject.rootDir} ; ${command}"].execute()
    if (proc.waitFor() != 0) {
        throw new RuntimeException("Failed to run: ${command}\n${proc.err.text}")
    } else {
        def err = proc.err.text
        if (err) {
            System.err.println(err)
        }
    }
    return proc.in.text;
}

task releng {
    doLast {
        def currentBranch = shell("git symbolic-ref --short HEAD")
        def tag = "v" + rootProject.ext.versionName
        println "Release engineering for ${tag} (branch=${currentBranch})"

        def changes = shell("git status -s")
        if (changes.trim()) {
            throw new RuntimeException("There are changes not commited yet.\n${changes}")
        }

        println "> git tag ${tag}"
        shell "git tag ${tag}"

        println "> git push origin ${tag}"
        shell "git push origin ${tag}"

        println "> git push origin ${tag}"
        shell "git push origin ${currentBranch}"
    }
}
