library 'status-jenkins-lib@v1.7.1'

/* Options section can't access functions in objects. */
def isPRBuild = utils.isPRBuild()

pipeline {
  agent { label 'windows && x86_64 && qt-5.15.2' }

  parameters {
    booleanParam(
      name: 'RELEASE',
      description: 'Decides whether binaries are built with debug symbols.',
      defaultValue: params.RELEASE ?: false
    )
    choice(
      name: 'VERBOSE',
      description: 'Level of verbosity based on nimbus-build-system setup.',
      choices: ['0', '1', '2']
    )
    string(
      name: 'NIMFLAGS',
      description: 'Extra Nim flags. Examples: --verbosity:2 --passL:"-v" --passC:"-v"',
      defaultValue: '--colors:off'
    )
  }

  options {
    timestamps()
    /* Prevent Jenkins jobs from running forever */
    timeout(time: 60, unit: 'MINUTES')
    /* manage how many builds we keep */
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '30',
      artifactNumToKeepStr: '3',
    ))
    /* Allows combined build to copy */
    copyArtifactPermission('/status-desktop/*')
    /* Abort old PR builds. */
    disableConcurrentBuilds(
      abortPrevious: isPRBuild
    )
  }

  environment {
    TARGET = "windows/${getArch()}"
    /* Improve make performance */
    MAKEFLAGS = "-j${utils.getProcCount()} V=${params.VERBOSE}"
    /* Explicitly set the QT version */
    QTDIR = "/c/Qt/5.15.2/msvc2019_64"
    PATH = "${env.QTDIR}/bin:${env.PATH}"
    /* Avoid weird bugs caused by stale cache. */
    QML_DISABLE_DISK_CACHE = "true"
    /* Control output the filename */
    STATUS_CLIENT_EXE = "pkg/${utils.pkgFilename(ext: 'exe', arch: getArch())}"
    /* 7zip archive filename */
    STATUS_CLIENT_7Z = "pkg/${utils.pkgFilename(ext: '7z', arch: getArch())}"
    /* RFC 3161 timestamping URL for DigiCert */
    WINDOWS_CODESIGN_TIMESTAMP_URL = 'http://timestamp.digicert.com'
  }

  stages {
    stage('Deps') {
      steps {
        sh 'make update'
        sh 'make deps'
      }
    }

    stage('status-go') {
      steps {
        sh 'make status-go'
      }
    }

    stage('Package') {
      steps { script {
        windows.bundle("${env.STATUS_CLIENT_EXE} ${env.STATUS_CLIENT_7Z}")
      } }
    }

    stage('Parallel Upload') {
      /* Uploads on Windows are slow. */
      parallel {
        stage('Upload 7Z') {
          steps { script {
            zip_url = s3.uploadArtifact(env.STATUS_CLIENT_7Z)
          } }
        }
        stage('Upload EXE') {
          steps { script {
            exe_url = s3.uploadArtifact(env.STATUS_CLIENT_EXE)
          } }
        }
      }
    }

    stage('Archive') {
      steps { script {
        archiveArtifacts(env.STATUS_CLIENT_EXE)
        archiveArtifacts(env.STATUS_CLIENT_7Z)
        env.PKG_URL = exe_url
        jenkins.setBuildDesc(Zip: zip_url, Exe: exe_url)
      } }
    }
  }
  post {
    success { script { github.notifyPR(true) } }
    failure { script { github.notifyPR(false) } }
    cleanup { sh './scripts/clean-git.sh' }
  }
}

def getArch() {
    def tokens = Thread.currentThread().getName().split('/')
    for (def arch in ['x86_64', 'aarch64']) {
      if (tokens.contains(arch)) { return arch }
    }
}