// Copyright 2017-present Open Networking Foundation
//
// 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.

def app = '${app}'
def version = '${version}'
def nextVersion = '${nextVersion}'
def branch = '${branch}'

def createBranch(def proj, def branch, def parent) {
    cmd = 'ssh -p 29418 gerrit.opencord.org gerrit create-branch ' + proj + " " + branch + " " + parent
    sh returnStdout: true, script: cmd
}

int checkBranchExists(def proj, def branch) {
    url = 'https://gerrit.opencord.org/projects/' + proj + '/branches/' + branch
    response = httpRequest url: url, validResponseCodes: '200,404'
    if (response.status == 404) {
        return 1
    }
    return 0
}

def changeVersion(def newVersion) {
    // TODO any other versions we need to account for?
    sh 'mvn versions:set -DnewVersion=' + newVersion + ' versions:commit'
}

node ('master') {
    stage ('Clean workspace') {
        cleanWs()
    }
    
    stage ('Checkout code') {
        //checkout([$class: 'RepoScm', currentBranch: true, manifestRepositoryUrl: 'https://gerrit.opencord.org/manifest', quiet: true])
        git branch: branch, url: 'ssh://jenkins@gerrit.opencord.org:29418/' + app
    }

    
    //stage 'Create support branch'
    //if (checkBranchExists(app, branch) == 0) {
    //  echo "Branch " + branch + " doesn't exist, creating
        //createBranch(app, version, 'opencord/master')
    //} else {
    //  echo "Support branch " + branch + " already exists"
    //}
    
    stage ('Checkout branch') {
        sh 'git checkout ' + branch
        sh 'gitdir=$(git rev-parse --git-dir); scp -p -P 29418 jenkins@gerrit.opencord.org:hooks/commit-msg ${gitdir}/hooks/'
    }
        
    stage ('Bump versions') {
        changeVersion(version)
    }
    
    stage ('Commit') {
        sh 'git add -A && git commit -m "Release version ' + version + '"'
    }
    
    stage ('Build and Test') {
        // TODO can we do this with clean .m2?
        sh 'mvn clean install'
    }

    stage ('Push to Gerrit') {
        sh 'git push origin HEAD:refs/for/' + branch
    }
    
    stage ('Wait for merge') {
        timeout(time: 1, unit: 'HOURS') {
            metadata = input id: 'release-build', message: 'Go to Gerrit and merge the release patch',
                    submitter: 'jono'
        }
    }

    stage ('Release to Maven Central') {
        sh 'mvn -Prelease clean deploy'
    }

    stage ('Wait for release OKed') {
        timeout(time: 1, unit: 'HOURS') {
            metadata = input id: 'release-build', message: 'Release the artifacts on Sonatype',
                    submitter: 'jono'
        }
    }

    stage ('Tag the release') {
        sh 'git tag -a ' + version + ' -m "Tagging version ' + version + '"'
        sh 'git push origin ' + version
    }
    
    stage ('Move to next SNAPSHOT version') {
        def snapshot = nextVersion + '-SNAPSHOT'
        changeVersion(snapshot)
        sh 'git add -A && git commit -m "Starting snapshot ' + snapshot + '"'
        sh 'git push origin HEAD:refs/for/' + branch
    }

    stage ('Finish') {
        sh 'echo "Released new app. Go to Gerrit and merge snapshot version bump"'
    }
    
}
