#=============================================================================
# Azure Pipeline settings
#=============================================================================

# Nightly build master for pypi upload
schedules:
- cron: "0 0 * * *"
  branches:
    include:
    - master
  always: true

# Auto cancel old PR builds
pr:
  autoCancel: true
# TODO : https://github.com/neuronsimulator/nrn/issues/1063
#  paths:
#    exclude:
#      - docs
#      - README.md

# Trigger build for certain branches only
trigger:
- master
- release/*

stages:
  - stage: BuildTestDeploy
    jobs:

    - job: 'ManyLinuxWheels'
      timeoutInMinutes: 45
      pool:
        vmImage: 'ubuntu-20.04'
      strategy:
        matrix:
          Python38:
            python.version: '3.8'
          Python39:
            python.version: '3.9'
          Python310:
            python.version: '3.10'
          Python311:
            python.version: '3.11'
          Python312:
            python.version: '3.12'
      steps:

      # Secure files documentation:
      #   https://docs.microsoft.com/en-us/azure/devops/pipelines/library/secure-files?view=azure-devops
      #   NOTE: when uploading new secure files, access must be permitted from the Azure pipeline interface (check message there)
      - task: DownloadSecureFile@1
        name: mpt_headersSF
        displayName: 'Download mpt_headers secure file'
        inputs:
          secureFile: 'mpt_headears.2.21.tar.gz'

      # Note that mpt headers must be mounted in the docker imager under `/nrnwheel/mpt`
      # This path is checked by `packaging/python/build_wheels.bash` when run in the image.
      - script: |
          sudo mkdir -p /opt/nrnwheel/mpt
          sudo tar -zxf $(mpt_headersSF.secureFilePath) --directory /opt/nrnwheel/mpt
          docker run --rm \
            -w /root/nrn \
            -v $PWD:/root/nrn \
            -v /opt/nrnwheel/mpt:/nrnwheel/mpt \
            -e NEURON_NIGHTLY_TAG \
            -e NRN_NIGHTLY_UPLOAD \
            -e NRN_RELEASE_UPLOAD \
            -e SETUPTOOLS_SCM_PRETEND_VERSION \
            -e NRN_BUILD_FOR_UPLOAD=1 \
            'neuronsimulator/neuron_wheel:latest-x86_64' \
            packaging/python/build_wheels.bash linux $(python.version) coreneuron
        displayName: 'Building ManyLinux Wheel'

      - script: |
          sudo apt update
          sudo apt install -y mpich openmpi-bin libopenmpi-dev libmpich-dev
        displayName: 'Install Test System Depdendencies'

      - template: ci/azure-wheel-test-upload.yml


    # Jobs to build OSX wheels natively
    - job: 'MacOSWheels'
      timeoutInMinutes: 60
      pool:
        vmImage: 'macOS-12'
      strategy:
        matrix:
          Python38:
            python.version: '3.8'
            python.org.version: '3.8.9'
            python.installer.name: 'macosx10.9.pkg'
          Python39:
            python.version: '3.9'
            python.org.version: '3.9.13'
            python.installer.name: 'macos11.pkg'
          Python310:
            python.version: '3.10'
            python.org.version: '3.10.11'
            python.installer.name: 'macos11.pkg'
          Python311:
            python.version: '3.11'
            python.org.version: '3.11.7'
            python.installer.name: 'macos11.pkg'
          Python312:
            python.version: '3.12'
            python.org.version: '3.12.0'
            python.installer.name: 'macos11.pkg'

      steps:

      - script: |
          installer=python-$(python.org.version)-$(python.installer.name)
          url=https://www.python.org/ftp/python/$(python.org.version)/$installer
          curl $url -o $installer
          sudo installer -pkg $installer -target /
        displayName: 'Install Python from python.org'

      - script: |
          brew install --cask xquartz
          brew install flex bison mpich
          brew unlink mpich && brew install openmpi
          cmake --version
          # see https://github.com/BlueBrain/CoreNeuron/issues/817, uninstall libomp until we fix this
          # as we are building wheels, we shouldn't enable OpenMP here anyway
          brew uninstall --ignore-dependencies libomp || echo "libomp doesn't exist"
        displayName: 'Install OSX System Dependencies'

      # readline has been manually built with ncurses and MACOSX_DEPLOYMENT_TARGET=10.9 and stored as secure file on Azure.
      # See `packaging/python/Dockerfile` for build instructions.
      #
      # Secure files documentation:
      #   https://docs.microsoft.com/en-us/azure/devops/pipelines/library/secure-files?view=azure-devops
      #   NOTE: when uploading new secure files, access must be permitted from the Azure pipeline interface (check message there)
      - task: DownloadSecureFile@1
        name: readlineSF
        displayName: 'Download readline secure file'
        inputs:
          secureFile: 'readline7.0-ncurses6.4.tar.gz'

      # 10.14 is required for full C++17 support according to
      # https://cibuildwheel.readthedocs.io/en/stable/cpp_standards, but it
      # seems that 10.15 is actually needed for std::filesystem::path.
      - script: |
          export MACOSX_DEPLOYMENT_TARGET=10.15
          export PATH=/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH
          export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
          export NRN_BUILD_FOR_UPLOAD=1
          sudo mkdir /opt/nrnwheel
          sudo tar -zxf $(readlineSF.secureFilePath) --directory /opt/nrnwheel/
          packaging/python/build_wheels.bash osx $(python.version) coreneuron
        displayName: 'Build MacOS Wheel'

      - template: ci/azure-wheel-test-upload.yml


  - stage: Final
    jobs:
      - job: AzureDropURL
        pool:
          vmImage: 'ubuntu-20.04'
        condition: eq(variables['Build.Reason'], 'PullRequest')
        steps:
          - checkout: none
          - script: |
              export AZURE_DROP_URL=`curl -v 'https://dev.azure.com/neuronsimulator/nrn/_apis/build/builds/$(Build.BuildId)/artifacts?artifactName=drop' | jq -r '.resource.downloadUrl'`
              echo "Setting dropurl to $AZURE_DROP_URL"
              echo "##vso[task.setvariable variable=dropurl]$AZURE_DROP_URL"
            displayName: 'Resolve Azure drop URL'
              
          - task: GitHubComment@0
            continueOnError: true
            inputs:
              gitHubConnection: 'neuronsimulator'
              repositoryName: '$(Build.Repository.Name)'
              comment: |
                ✔️ $(system.pullRequest.sourceCommitId) -> [Azure artifacts URL]($(dropurl))
