pipeline {
    agent any

    environment {
        VERSION = ''
    }

    stages {
        stage('Set build number into version') {
            steps {
                script {
                    def baseVersion = sh(
                        script: 'mvn -q help:evaluate -Dexpression=project.version -DforceStdout',
                        returnStdout: true
                    ).trim()

                    def parts = baseVersion.tokenize('.')
                    parts[parts.size() - 1] = "${env.BUILD_NUMBER}"
                    env.VERSION = parts.join('.')

                    sh "mvn -B versions:set -DnewVersion=${env.VERSION}"
                    sh 'mvn -B versions:commit'

                    echo "Build version: ${env.VERSION}"
                }
            }
        }

        stage('Maven package') {
            steps {
                sh 'mvn -B clean package'
            }
        }

        stage('Build docker image') {
            steps {
                sh "docker build -f docker/Dockerfile -t pfsdn:${env.VERSION} ."
            }
        }

        stage('Deploy') {
            steps {
                script {
                    echo "Saving docker image pfsdn:${env.VERSION}"
                    sh "docker save pfsdn:${env.VERSION} | gzip > pfsdn-${env.VERSION}.tar.gz"
                    archiveArtifacts artifacts: "pfsdn-${env.VERSION}.tar.gz", fingerprint: true

                    echo "Saving pfapp artifact launcher/target/${env.VERSION}.pfapp"
                    archiveArtifacts artifacts: "launcher/target/${env.VERSION}.pfapp", fingerprint: true

                    echo "TODO: deploy ${env.VERSION}.pfapp to repository (not implemented yet)"
                }
            }
        }
    }

    post {
        always {
            script {
                if (env.VERSION ==~ /^\d+\.\d+\.\d+\.\d+$/) {
                    sh "docker rmi pfsdn:${env.VERSION} || true"
                }
            }
            cleanWs()
        }
    }
}
