/*
 Version Info Examples
 =====================

 Nightly Build Snapshot
 * git tag:
 * Full Version: 3.1-5124
 * POM Version: 3.1.0-SNAPSHOT
 * NBM Revision: 5124
 * NBM UC Suffix: nightly/3.1/plugins

 Nightly Build Snapshot (PBRIsComing branch)
 * git tag:
 * Full Version: 3.1-PBRIsComing-5124
 * POM Version: 3.1.0-PBRIsComing-SNAPSHOT
 * NBM Revision: 5124
 * NBM UC Suffix: PBRIsComing-nightly/3.1/plugins

 Alpha1 Release
 * git tag: v3.1.0-alpha1
 * Full Version: 3.1-alpha1
 * POM Version: 3.1.0-alpha1
 * NBM Revision: 0
 * NBM UC Suffix: stable/3.1/plugins

 Final Release
 * git tag: v3.1.0
 * Full Version: 3.1
 * POM Version: 3.1.0
 * NBM Revision: 0
 * NBM UC Suffix: stable/3.1/plugins
 */

import java.text.SimpleDateFormat
import org.ajoberstar.grgit.*

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.ajoberstar:gradle-git:1.2.0'
    }
}

ext {
    jmeRevision     = 0
    jmeGitHash      = ""
    jmeGitTag       = ""
    jmeShortGitHash = ""
    jmeBuildDate    = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
    jmeBranchName   = "unknown"
    jmeFullVersion  = "${jmeVersion}-UNKNOWN"
    jmePomVersion   = "unknown"
}

def getReleaseInfo(String tag) {
    if (tag == null) {
        // not a tagged commit
        return null;
    }
    if (!tag.startsWith("v")) {
        // syntax error
        return null;
    }
    tag = tag.substring(1)

    String[] parts = tag.split("-", 2);
    String mainVersion;
    boolean prerelease;
    String releaseName = null;

    if (parts.length == 2) {
        // prerelease
        prerelease = true;
        mainVersion = parts[0];
        releaseName = parts[1];
        if (releaseName.size() == 0) {
            // syntax error
            return null;
        }
    } else if (parts.length == 1) {
        // final release
        prerelease = false;
        mainVersion = parts[0];
    } else {
        // error
        return null;
    }

    if (mainVersion.size() == 0) {
        // syntax error
        return null;
    }

    parts = mainVersion.split("\\.");
    if (parts.size() != 3) {
        // syntax error
        return null;
    }

    String baseVersion = parts[0] + "." + parts[1];

    return [
        "tag" : tag,
        "baseVersion" : baseVersion,
        "mainVersion" : mainVersion,
        "prerelease" :  prerelease,
        "releaseName" : releaseName,
        "releaseSuffix": (prerelease ? "-${releaseName}": "")
    ]
}

task configureVersionInfo {
    try {
        def grgit = Grgit.open(project.file('.'))
        def head = grgit.head()
        jmeRevision = grgit.log(includes: [head]).size()
        jmeGitHash = head.id
        jmeShortGitHash = head.abbreviatedId
        jmeBranchName = grgit.branch.current.name
        jmeGitTag = grgit.tag.list().find { it.commit == head }

        if (jmeGitTag != null) {
            jmeGitTag = jmeGitTag.name
        } else {
            if (System.env.APPVEYOR_REPO_TAG == "true") {
                jmeGitTag = System.env.APPVEYOR_REPO_TAG_NAME
            } else {
                jmeGitTag = System.env.TRAVIS_TAG
            }
        }

        def releaseInfo = getReleaseInfo(jmeGitTag)
        if (releaseInfo != null) {
            jmeFullVersion = "${releaseInfo.baseVersion}${releaseInfo.releaseSuffix}"
            jmePomVersion = "${releaseInfo.mainVersion}${releaseInfo.releaseSuffix}"
        } else {
            // SNAPSHOT
            jmeFullVersion = jmeMainVersion
            jmePomVersion  = jmeVersion
            if (System.env.TRAVIS_BRANCH != null) {
                jmeBranchName = System.env.TRAVIS_BRANCH
            } else if (System.env.APPVEYOR_REPO_BRANCH != null) {
                jmeBranchName = System.env.APPVEYOR_REPO_BRANCH
            }
            if (System.env.TRAVIS_PULL_REQUEST != null &&
                System.env.TRAVIS_PULL_REQUEST != "false") {
                jmeBranchName += "-pr-" + System.env.TRAVIS_PULL_REQUEST
            } else if (System.env.APPVEYOR_PULL_REQUEST_NUMBER != null) {
                jmeBranchName += "-pr-" + System.env.APPVEYOR_PULL_REQUEST_NUMBER
            }
            if (jmeBranchName != "master") {
                jmeFullVersion += "-${jmeBranchName}"
                jmePomVersion  += "-${jmeBranchName}"
            }
            jmeFullVersion += "-${jmeRevision}"
            jmePomVersion  += "-SNAPSHOT"
        }

        logger.warn("Full Version: ${jmeFullVersion}")
        logger.warn("POM Version: ${jmePomVersion}")
    } catch (ex) {
        // Failed to get repo info
        logger.warn("Failed to get repository info: " + ex.message + ". " + \
                    "Only partial build info will be generated.")
    }
}