
# Controls when the workflow will run
on:
  # Run this workflow after the TREXIO CI completed
  workflow_run:
    workflows: [ "TREXIO CI" ]
    branches: [ master ]
    types:
      - completed

# Workflow to build and publish wheels.
# in the get_commit_message job: Include [wheel build] in your commit message to trigger this build.
name: Build CPython wheels
jobs:

  get_commit_message:
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    name: Get commit message
    runs-on: ubuntu-22.04
    outputs:
      message: ${{ steps.commit_message.outputs.message }}
    steps:
      - name: Checkout the repo
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
        # Gets the correct commit message for pull request
        with:
          ref: ${{ github.event.pull_request.head.sha }}
      - name: Get commit message
        id: commit_message
        run: |
          set -xe
          COMMIT_MSG=$(git log --no-merges -1 --oneline)
          echo "message=$COMMIT_MSG" >> $GITHUB_OUTPUT
          echo github.ref ${{ github.ref }}


  build_macos_wheels:
    name: build wheels for different versions of cpython on macos 
    needs: get_commit_message
    if: >-
      contains(needs.get_commit_message.outputs.message, '[wheel build]') ||
      (github.repository == 'trex-coe/trexio' && startswith(github.ref, 'refs/tags/v'))
    runs-on: ${{ matrix.buildplat[0] }}
    env:
      HDF5_INSTALLDIR: "/Users/runner/work/trexio/trexio/hdf5"
    strategy:
      # Ensure that a wheel builder finishes even if another fails
      fail-fast: false
      matrix:
        # Github Actions doesn't support pairing matrix values together, let's improvise
        # https://github.com/github/feedback/discussions/7835#discussioncomment-1769026
        buildplat:
          - [macos-13, macosx_x86_64]
          - [macos-14, macosx_arm64]
        # test config
        python: ["cp38", "cp39", "cp310", "cp311", "cp312"]
        exclude:
          - buildplat: [macos-14, macosx_arm64]
            python: "cp38"

    steps:
      - uses: actions/checkout@e2f20e631ae6d7dd3b768f56a5d2af784dd54791

      - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
        with:
          python-version: "3.x"

      - name: install dependencies
        run: |
          brew install emacs
          brew install automake
          brew install libtool
          brew install swig

      - uses: actions/cache@v3
        id: cache-hdf5
        with:
          path: $HDF5_INSTALLDIR
          key: ${{ matrix.buildplat[0] }}-hdf5

      - name: install hdf5
        if: ${{ steps.cache-hdf5.outputs.cache-hit != 'true' }}
        run: |
          wget https://github.com/HDFGroup/hdf5/archive/refs/tags/hdf5-1_12_3.tar.gz
          tar -xzf hdf5-1_12_3.tar.gz
          cd  hdf5-hdf5-1_12_3
          if [[ "$ARCH" == "arm64" ]]; then
            export MACOSX_DEPLOYMENT_TARGET="11.0"
          else
            export MACOSX_DEPLOYMENT_TARGET="10.9"
          fi
          ./autogen.sh
          ./configure CC=gcc-12 --prefix $HDF5_INSTALLDIR --enable-build-mode=production --with-szlib
          make -j3
          make install

      - name: configure with autotools
        run: |
          ./autogen.sh
          export PATH=${PATH}:${HDF5_INSTALLDIR}/bin
          ./configure FC=gfortran-12 --enable-silent-rules
          make -j3
          
      - name: prepare python 
        run: |
          make python-install

      - name: cleanup python 
        run: |
          rm -rf src/ tools/ 
          mv python/* .

      - name: Build wheels
        uses: pypa/cibuildwheel@bd033a44476646b606efccdd5eed92d5ea1d77ad  # v2.20.0
        env:
          CIBW_PRERELEASE_PYTHONS: False
          CIBW_FREE_THREADED_SUPPORT: False
          CIBW_BUILD: ${{ matrix.python }}-${{ matrix.buildplat[1] }}
          CIBW_BUILD_VERBOSITY: 1
          CIBW_BUILD_FRONTEND: "build"
          CIBW_ENVIRONMENT: H5_CFLAGS="-I/Users/runner/work/trexio/trexio/hdf5/include" H5_LDFLAGS="-L/Users/runner/work/trexio/trexio/hdf5/lib"
        # disable pytest-ing for now - does not work as expected via CIBW on MacOS --> Ask Anthony to test locally  
        #CIBW_TEST_REQUIRES: pytest
        #CIBW_TEST_COMMAND: "python3 -m pytest -v test/test_api.py"


      - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6
        with:
          name: pytrexio-${{ matrix.python }}-${{ matrix.buildplat[1] }}-wheels
          path: ./wheelhouse/*.whl


  build_linux_wheels:
    name: build wheels for different versions of cpython on manylinux_x86_64
    needs: get_commit_message
    if: >-
      contains(needs.get_commit_message.outputs.message, '[wheel build]') ||
      (github.repository == 'trex-coe/trexio' && startswith(github.ref, 'refs/tags/v'))
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        manylinux_tag: [2014_x86_64, 2_28_x86_64]
  
    steps:
      - name: Checkout the branch
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
  
      - name: Set up Python
        uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f
        with:
          python-version: '3.10'
  
      - name: Install build dependencies
        run: python -m pip install -U setuptools
  
      - name: Compute the PYTREXIO_VERSION environment variable
        run: echo "PYTREXIO_VERSION=$(grep __version__ python/pytrexio/_version.py | cut -d\  -f3 | tr -d '"')" >> $GITHUB_ENV
  
      - name: Print the PYTREXIO_VERSION
        run: echo ${{ env.PYTREXIO_VERSION }}
  
      # Conventional download-artifact action does not work for artifact produced in a different workflow,
      # which is the case here (TREXIO CI produced the Python API distribution tarball)
      - name: Download the Python API distribution tarball
        uses: dawidd6/action-download-artifact@v2
        with:
          # Specify the name of the workflow file which uploaded the tarball
          workflow: actions.yml
          workflow_conclusion: success
          name: pytrexio-source
          path: python
  
      # at the moment we have to pull the custom container with pre-installed HDF5
      # the containers are built and stored in GitHub container registry ghcr.io/q-posev
      - name: Pull the manylinux Docker container with HDF5
        run: docker pull ghcr.io/q-posev/hdf5_1_12_on_${{ matrix.manylinux_tag }}:latest
  
      - name: Build wheels for different versions of CPython inside the Docker container
        run: >
          docker run --rm
          --env PLAT=manylinux${{ matrix.manylinux_tag }}
          --volume `pwd`:/tmp
          --workdir /tmp
          ghcr.io/q-posev/hdf5_1_12_on_${{ matrix.manylinux_tag }}
          /bin/bash build_manylinux_wheels.sh trexio-${{ env.PYTREXIO_VERSION }}.tar.gz
        working-directory: python
  
      - name: Upload produced wheels as artifacts
        uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6
        with:
          name: pytrexio-manylinux-${{ matrix.manylinux_tag }}-wheels
          path: ./python/wheelhouse/*.whl
  
  
  publish_wheels:
    name: Publish all wheels on PyPI
    needs: [build_linux_wheels, build_macos_wheels]
    runs-on: ubuntu-22.04
    permissions:
      # IMPORTANT: this permission is mandatory for trusted publishing
      id-token: write
  
    steps:
      - name: Checkout the branch
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
  
      - name: Set up Python
        uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f
        with:
          python-version: '3.10'
  
      - name: Install build dependencies
        run: python -m pip install -U setuptools twine
  
      - name: Download the build artifacts (wheels) of this workflow
        uses: actions/download-artifact@v4
        with:
          path: dist
  
      - name: Download the Python API distribution tarball
        uses: dawidd6/action-download-artifact@v2
        with:
          workflow: actions.yml
          workflow_conclusion: success
          name: pytrexio-source
          path: dist
  
      # The artifacts have to be in dist/ directory so that
      # pypa/gh-action-pypi-publish action can discover them
      - name: Display and rearrange the downloaded artifacts
        run: |
          ls -R
          mv pytrexio-*-wheels/trexio-*.whl ./
          rm -rf -- pytrexio-*-wheels/
          ls -sh -w 1
        working-directory: dist
  
      #- name: Publish distribution 📦 to Test PyPI
      #  uses: pypa/gh-action-pypi-publish@release/v1
      #  with:
      #    repository_url: https://test.pypi.org/legacy/
      #    verbose: true
      #    ##verify-metadata: false

      - name: Publish distribution 📦 to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        ##if: startsWith(github.ref, 'refs/tags')
