pipeline {
    agent { label 'linux && amd64 && android' }

    options { 
        buildDiscarder(logRotator(numToKeepStr: '135', daysToKeepStr: '21'))
        gitLabConnection('GitLabConnectionJenkins')
    }

    environment {
        BUILD_OPTIONS = ' '
    }

    stages {
        stage('clean previous runs and update gitlab commit status'){
            steps{
                deleteDir()
                updateGitlabCommitStatus(name: 'Build Android', state: 'running')
            }
        }
        stage('Get build parameters'){
            parallel{
                stage('Get build options'){
                    when {
                        allOf {
                            expression { env.gitlabTriggerPhrase != null }
                            expression { env.gitlabTriggerPhrase.contains('BUILD_OPTIONS') }
                        }
                    }
                    steps {
                        script{
                            BUILD_OPTIONS = sh(script: 'echo "$gitlabTriggerPhrase" | grep BUILD_OPTIONS | awk -F "BUILD_OPTIONS="  \'{print \$2}\' | cut -d"\"" -f2', returnStdout: true).trim()
                            println BUILD_OPTIONS
                        }
                    }
                    post{
                        always {
                            script{                        
                                if (currentBuild.currentResult == 'FAILURE'){
                                    addGitLabMRComment(comment: ":red_circle: ${env.JOB_NAME} FAILURE when getting the additional build parameters :worried:<br/>Build results: [Jenkins [${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}]](${env.RUN_DISPLAY_URL})<br/>Commit: ${env.GIT_COMMIT}" )
                                }
                            }
                        }
                    }
                }

                stage('Get MEGAchat branch'){
                    steps {
                        script{
                            env.MEGACHAT_BRANCH = sh(script: 'echo "$gitlabMergeRequestDescription" | grep MEGACHAT_BRANCH_TO_TEST | awk -F "MEGACHAT_BRANCH_TO_TEST="  \'{print \$2}\' | cut -d" " -f1', returnStdout: true).trim()
                            if (MEGACHAT_BRANCH == ""){
                                echo "MEGACHAT_BRANCH was not found on description so develop will be used by default"
                                env.MEGACHAT_BRANCH = "develop"
                            }
                            println MEGACHAT_BRANCH
                        }
                    }
                    post{
                        always {
                            script{                        
                                if (currentBuild.currentResult == 'FAILURE'){
                                    addGitLabMRComment(comment: ":red_circle: ${env.JOB_NAME} FAILURE when getting the MEGAchat branch :worried:<br/>Build results: [Jenkins [${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}]](${env.RUN_DISPLAY_URL})<br/>Commit: ${env.GIT_COMMIT}" )
                                }
                            }
                        }
                    }
                }

                stage('Get Android branch'){
                    steps {
                        script{
                            env.ANDROID_BRANCH = sh(script: 'echo "$gitlabMergeRequestDescription" | grep ANDROID_BRANCH_TO_TEST | awk -F "ANDROID_BRANCH_TO_TEST="  \'{print \$2}\' | cut -d" " -f1', returnStdout: true).trim()
                            if (ANDROID_BRANCH == ""){
                                echo "ANDROID_BRANCH was not found on description so develop will be used by default"
                                env.ANDROID_BRANCH = "develop"
                            }
                            println ANDROID_BRANCH
                        }
                    }
                    post{
                        always {
                            script{                        
                                if (currentBuild.currentResult == 'FAILURE'){
                                    addGitLabMRComment(comment: ":red_circle: ${env.JOB_NAME} FAILURE when getting the Android branch :worried:<br/>Build results: [Jenkins [${env.JOB_NAME} ${env.BUILD_DISPLAY_NAME}]](${env.RUN_DISPLAY_URL})<br/>Commit: ${env.GIT_COMMIT}" )
                                }
                            }
                        }
                    }
                }

            }
        }

        stage('Build Android'){
            parallel{
                stage('Android SDK example'){
                    options{
                        timeout(time: 200, unit: 'MINUTES')
                    }
                    stages {
                        stage('Checkout SDK'){
                            steps {
                                checkout([
                                    $class: 'GitSCM', 
                                    branches: [[name: "${env.gitlabSourceBranch}"]],
                                    userRemoteConfigs: [[ url: "${env.GIT_URL_SDK}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                                    extensions: [
                                        [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"],
                                        [$class: 'PreBuildMerge', options: [fastForwardMode: 'FF', mergeRemote: "origin", mergeStrategy: 'DEFAULT', mergeTarget: "${env.gitlabTargetBranch}"]]
                                        ]                        
                                ])
                                script{
                                    sdk_sources_workspace = WORKSPACE
                                }
                            }
                        }
                        stage('Build SDK and exampleApp'){
                            environment{
                                BUILD_ARCHS = "arm64-v8a"
                                ANDROID_HOME = "/home/jenkins/android-cmdlinetools/"
                                ANDROID_NDK_HOME ="/home/jenkins/android-ndk/"
                            }
                            steps{
                                dir("${sdk_sources_workspace}/examples/android/ExampleApp") {
                                    script{
                                        env.PATH="${env.PATH}:${env.ANDROID_HOME}/cmdline-tools/tools/bin/"
                                    }
                                    //Clean
                                    sh "./gradlew --no-daemon --max-workers=1 clean"
                                    dir("app/src/main/jni/"){
                                        sh "sed -i 's#JOBS=.*#JOBS=1#' build.sh"
                                        sh "sed -i 's#LOG_FILE=/dev/null#LOG_FILE=/dev/stdout#g' build.sh"
                                        sh "bash -x ./build.sh clean"
                                        sh "rm -rf ../java/nz/mega/sdk"
                                        //Build SDK and libs
                                        sh "bash -x ./build.sh all"
                                    }
                                    //Build Example App
                                    sh "./gradlew --no-daemon --max-workers=1 build"
                                    sh "rm examples-*.tar.gz || :"
                                    sh "tar czf examples-${BUILD_ID}.tar.gz -C app/build/outputs apk"
                                }
                            }
                        }
                    }
                    post{
                         always{
                             archiveArtifacts artifacts: 'examples/android/ExampleApp/examples-*.tar.gz', fingerprint: true
                         }
                     }
                }

                stage('SDK and Android crosscompilation'){
                    options{
                        timeout(time: 300, unit: 'MINUTES')
                    }
                    agent { label 'linux && amd64 && android' }
                    stages {
                        stage('Checkout SDK MEGAchat and Android'){
                            steps {
                                deleteDir()
                                //Clone Android
                                sh "echo Cloning android branch ${ANDROID_BRANCH}"
                                checkout([
                                    $class: 'GitSCM', 
                                    branches: [[name: "origin/${ANDROID_BRANCH}"]],
                                    userRemoteConfigs: [[ url: "${env.GIT_URL_ANDROID}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                                    extensions: [
                                        [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"]
                                        ]
                                ])
                                dir("sdk/src/main/jni/megachat/sdk"){
                                    //Clone MEGAchat branch
                                    sh "echo Cloning megachat branch ${MEGACHAT_BRANCH}"
                                    checkout([
                                        $class: 'GitSCM', 
                                        branches: [[name: "origin/${MEGACHAT_BRANCH}"]],
                                        userRemoteConfigs: [[ url: "${env.GIT_URL_MEGACHAT}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                                        extensions: [
                                            [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"]
                                            ]
                                    ])
                                    script{
                                        megachat_sources_workspace = WORKSPACE
                                    }
                                }
                                dir('sdk/src/main/jni/mega/sdk'){  
                                    //Clone SDK (with PreBuildMerge)                      
                                    checkout([
                                        $class: 'GitSCM', 
                                        branches: [[name: "origin/${env.gitlabSourceBranch}"]],
                                        userRemoteConfigs: [[ url: "${env.GIT_URL_SDK}", credentialsId: "12492eb8-0278-4402-98f0-4412abfb65c1" ]],
                                        extensions: [
                                            [$class: "UserIdentity",name: "jenkins", email: "jenkins@jenkins"],
                                            [$class: 'PreBuildMerge', options: [fastForwardMode: 'FF', mergeRemote: "origin", mergeStrategy: 'DEFAULT', mergeTarget: "${env.gitlabTargetBranch}"]]
                                            ]
                                    ])
                                    script{
                                        sdk_sources_workspace = WORKSPACE
                                    }
                                }
                                script{
                                    android_sources_workspace = WORKSPACE
                                    sdk_sources_workspace = "${megachat_sources_workspace}/third-party/mega"
                                }
                            }
                        }
                        stage('Build SDK and Android App'){
                            environment{
                                BUILD_ARCHS = "arm64-v8a"
                                ANDROID_HOME = "/home/jenkins/android-cmdlinetools/"
                                ANDROID_NDK_HOME ="/home/jenkins/android-ndk/"
                                DEFAULT_GOOGLE_MAPS_API_PATH = "/home/jenkins/android-default_google_maps_api" 
                                ANDROID_WEBRTC="/home/jenkins/android-webrtc"
                                USE_PREBUILT_SDK = false
                                ARTIFACTORY_BASE_URL = "${env.REPOSITORY_URL}"
                            }
                            steps{
                                //build SDK
                                dir("sdk/src/main/jni"){
                                    script{
                                        env.PATH="${env.PATH}:${env.ANDROID_HOME}/cmdline-tools/tools/bin/"
                                    }
                                    sh "ln -sfrT ${ANDROID_WEBRTC} megachat/webrtc"
                                    sh "sed -i 's#JOBS=.*#JOBS=1#' build.sh"
                                    sh "sed -i 's#LOG_FILE=/dev/null#LOG_FILE=/dev/stdout#g' build.sh"
                                    sh "./build.sh clean"
                                    sh "./build.sh all"
                                }
                              sh "cp -r ${DEFAULT_GOOGLE_MAPS_API_PATH}/* app/src/"
                              sh "./gradlew --no-daemon --max-workers=1 assembleGms"
                            }
                        }

                        stage ('Android Unit Tests'){
                            environment{
                                BUILD_ARCHS = "arm64-v8a"
                                ANDROID_HOME = "/home/jenkins/android-cmdlinetools/"
                                ANDROID_NDK_HOME ="/home/jenkins/android-ndk/"
                                DEFAULT_GOOGLE_MAPS_API_PATH = "/home/jenkins/android-default_google_maps_api" 
                                ANDROID_WEBRTC="/home/jenkins/android-webrtc"
                                USE_PREBUILT_SDK = false
                                ARTIFACTORY_BASE_URL = "${env.REPOSITORY_URL}"
                            }
                            steps{
                                sh "./gradlew --no-daemon --max-workers=1 data:testGmsDebugUnitTestCoverage"
                            }
                        }
                    }
                }
            }
        }
    }
            
    post{
        always {
            script{
                if (currentBuild.currentResult == 'SUCCESS'){
                    addGitLabMRComment(comment: ":white_check_mark: ${currentBuild.projectName} :penguin: <b>Android</b> SUCCEEDED :muscle:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                    updateGitlabCommitStatus(name: 'Build Android', state: 'success')
                }                                
                if (currentBuild.currentResult == 'FAILURE'){
                    addGitLabMRComment(comment: ":red_circle: ${currentBuild.projectName} :penguin: <b>Android</b> FAILURE  :worried:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                    updateGitlabCommitStatus(name: 'Build Android', state: 'failed')
                }
                if (currentBuild.currentResult == 'ABORTED'){
                    addGitLabMRComment(comment: ":interrobang: ${currentBuild.projectName} :penguin: <b>Android</b> ABORTED  :confused:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                    updateGitlabCommitStatus(name: 'Build Android', state: 'canceled')
                }                                
                if (currentBuild.currentResult == 'UNSTABLE'){
                    addGitLabMRComment(comment: ":interrobang: ${currentBuild.projectName} :penguin: <b>Android</b> UNSTABLE  :confused:<br/>Build results: [Jenkins [${currentBuild.displayName}]](${currentBuild.absoluteUrl})<br/>Commit: ${env.GIT_COMMIT}" )
                    updateGitlabCommitStatus(name: 'Build Android', state: 'failed')
                }
            }
        }
    }
}
