def String PATCH_VERSION = new Date().format('ddHHmm')
def String YEAR = Integer.toString(new Date().format('yy').toInteger() + 1)
def String BUMPED_MONTH = Integer.toString(new Date().format('MM').toInteger() + 20)

pipeline {
	agent { label getPipelineSlaveLabel()  }
	options {
		buildDiscarder(logRotator(numToKeepStr:'10'))
		timestamps()
	}
	environment {
		RELEASE_NAME=asap("getBuildProperty releaseName")
		RETRY_TIMES=asap("getBuildProperty retryTimes")
		NPM_READ_REPOSITORY=asap("getBuildProperty NPM_READ_REPOSITORY")
		NPM_WRITE_REPOSITORY=asap("getBuildProperty NPM_WRITE_REPOSITORY")
		DOCKER_READ_REPOSITORY=asap("getBuildProperty DOCKER_READ_REPOSITORY")
		MAJOR_VERSION=asap("getBuildProperty majorVersion")
		MINOR_VERSION=asap("getBuildProperty minorVersion")
		COMPONENT_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$YEAR$BUMPED_MONTH$PATCH_VERSION"
		COMPONENT_NAME=asap("getBuildProperty componentName")
		IMAGE_TAG="$COMPONENT_NAME-image"
		ASAP_PROPERTY_FILE=asap("getBuildProperty ASAP_PROPERTY_FILE")
		DOCKER_OPTS="--rm --user \$(id -u):\$(id -g) -v \$(pwd):/usr/src -w /usr/src -v \$(pwd):/root --env-file ${ASAP_PROPERTY_FILE}"
		NPM="docker run ${DOCKER_OPTS} ${IMAGE_TAG} npm"
	}
	stages {
		stage('Pre-build') {
			when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
			steps {
				retry(RETRY_TIMES){
					script {
						Map scopeMap = [
							'@watsonanalytics':"${NPM_READ_REPOSITORY}",
							'@waca':"${NPM_READ_REPOSITORY}",
							'@businessanalytics':"${NPM_READ_REPOSITORY}"
						]
						asapMakeNpmrc(registry: "${NPM_READ_REPOSITORY}", scopeMap: scopeMap)
					}
					sh "docker build \
						--no-cache \
						--tag ${IMAGE_TAG} \
						--file ./Dockerfile \
						."
				}
			}
		}
		stage('Build') {
			when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
			steps {
				retry(RETRY_TIMES){
					sh "$NPM version $COMPONENT_VERSION"
					sh "$NPM install"
					sh "$NPM run build"
				}
			}
		}
		stage('Publish Artifact to NPM registry') {
			when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
			steps {
				retry(RETRY_TIMES){
					script{
						def scopeMap = [:]
						scopeMap =[
							'@waca':"${NPM_WRITE_REPOSITORY}",
						]
						asapMakeNpmrc(registry:"${NPM_READ_REPOSITORY}", scopeMap: scopeMap)
						sh "$NPM publish --registry ${NPM_WRITE_REPOSITORY}"
					}
				}
			}
		}
		stage('ASAP Integration testing') {
			when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
			steps {
				retry(RETRY_TIMES){
					script {
						DO_PROMOTE=env.BRANCH_NAME == asap("getBuildProperty releaseName") || env.BRANCH_NAME == 'master'
						asap("setBuildProperty promote=$DO_PROMOTE")
						asap("testAndPromote")
					}
				}
			}
		}
		stage('Trigger Downstream') {
			agent any
			when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
			steps {
				retry(RETRY_TIMES){
					build job: "BusinessAnalytics/ba-glass-client/${BRANCH_NAME}", wait: false
				}
			}
		}
	}
	post {
		failure {
			script {
				if(env.RELEASE_NAME == env.BRANCH_NAME) {
					pipelineSlackSendBuildInfo(currentBuild, "", '#ba-glass-builds')
				}
			}
		}
		always {
			asapPipelineTeardown()
		}
	}
}
