name: Publish 📦 to PyPI

# Build on every branch push, tag push, and pull request change:
on:
  push:
    branches:
      - main
    tags:
      - v*
  pull_request:

jobs:
  build_wheels:
    name: Build 🐍 wheels 📦 on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        # skip building wheel for windows as it's not working yet
        os: [ubuntu-latest, macos-latest]  #windows-2019

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Symlink gfortran (macOS)
        if: runner.os == 'macOS'
        run: |
          brew install gcc
          fc_files=( $(brew --prefix)/bin/gfortran-* )
          sudo ln -sf "${fc_files[@]: -1}" /usr/local/bin/gfortran
          gfortran --version

      - name: Symlink gfortran (Windows)
        if: runner.os == 'Windows'
        uses: msys2/setup-msys2@v2

      - name: Tell distutils to use mingw (Windows)
        if: runner.os == 'Windows'
        run: |
          echo "[build]`ncompiler=mingw32" | Out-File -Encoding ASCII ~/pydistutils.cfg

      - name: Build wheels
        uses: pypa/cibuildwheel@v3.3.1
        env:
          # Disable building for PyPy and 32bit.
          CIBW_SKIP: pp* *-win32 *-manylinux_i686
          CIBW_ENVIRONMENT_MACOS: MACOSX_DEPLOYMENT_TARGET="15.0"
          CIBW_BEFORE_BUILD_MACOS: python -m pip install --upgrade pip
          # Package the DLL dependencies in the wheel for windows (done by default for the other platforms).
          # delvewheel cannot mangle the libraries, stripping does not work.
          CIBW_BEFORE_BUILD_WINDOWS: pip install delvewheel
          CIBW_REPAIR_WHEEL_COMMAND_WINDOWS: "delvewheel show {wheel} && delvewheel repair -w {dest_dir} {wheel} --no-mangle-all"

      - uses: actions/upload-artifact@v4
        with:
          name: artifact-wheels-${{ matrix.os }}
          path: ./wheelhouse/*.whl

  build_sdist:
    name: Build 🐍 source distribution 📦
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Build sdist
        run: pipx run build --sdist

      - uses: actions/upload-artifact@v4
        with:
          name: artifact-source
          path: dist/*.tar.gz

  upload_pypi:
    name: Upload 📦 to PyPI
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    if: github.repository_owner == 'insarlab' && github.event_name == 'push'
    steps:
      - uses: actions/download-artifact@v4
        with:
          # unpacks default artifact into dist/
          # if `name: artifact` is omitted, the action will create extra parent dir
          path: dist
          pattern: artifact-*
          merge-multiple: true
      - name: Display structure of downloaded files
        run: ls -R dist

      - name: Publish developed version 📦 to Test PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.TEST_PYPI_API_TOKEN }}
          repository-url: https://test.pypi.org/legacy/
          skip-existing: false
          verbose: true

      - name: Publish released version 📦 to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        if: startsWith(github.ref, 'refs/tags/v')
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}
          verbose: true
