# Because this library provides extension modules for macOS, but not for other
# platforms, we want to provide built distributions for each macOS platform, but we
# explicitly DON'T want to provide a cross-platform pure-Python wheel to fall back on.
#
# This is because in the event that a new Python version is released or a new
# macOS platform is released, macOS users won't be able to install the built
# distributions we've provided and should fall back to the source distribution,
# but pip's behavior is to prefer a pure-Python wheel first, which will be
# missing the extension modules.
#
# However, to provide built distributions for Linux and Windows (which don't
# have extension modules) we can just build a pure-Python wheel on that
# platform and override the platform name manually via wheel's --plat-name
# feature, to provide a platform-specific wheel for all platforms.

name: Build & Publish

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - "**"

  workflow_dispatch:
    inputs:
      branch:
        description: "The branch, tag or SHA to release from"
        required: true
        default: "master"

concurrency:
  group: ${{ github.ref }}-${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name != 'pull_request' && github.sha || '' }}
  cancel-in-progress: true

jobs:
  macos-built-distributions:
    name: Build macOS wheels
    runs-on: macos-latest
    timeout-minutes: 20
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.inputs.branch }}
      - name: Install Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Install build dependencies
        run: python -m pip install cibuildwheel
      - name: Build wheels
        run: python -m cibuildwheel
        env:
          CIBW_ARCHS_MACOS: "x86_64 universal2 arm64"
      - name: Artifacts list
        run: ls -l wheelhouse
      - uses: actions/upload-artifact@v4
        with:
          name: python-package-distributions-macos
          path: ./wheelhouse/*.whl

  pure-built-distributions:
    name: Build pure wheels
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.inputs.branch }}
      - name: Install Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Install build dependencies
        run: python -m pip install -U setuptools wheel
      - name: Build wheels
        run: |
          for platform in 'manylinux2014_x86_64' 'manylinux2014_i686' 'manylinux2014_aarch64' 'manylinux2014_armv7l' 'manylinux2014_ppc64' 'manylinux2014_ppc64le' 'manylinux2014_s390x' 'win32' 'win_amd64' 'win_ia64'
          do
            python setup.py bdist_wheel --plat-name $platform
          done
      - name: Artifacts list
        run: ls -l dist
      - uses: actions/upload-artifact@v4
        with:
          name: python-package-distributions-pure-wheels
          path: ./dist/*.whl

  source-distribution:
    name: Build source distribution
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.inputs.branch }}
      - name: Install Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Build source distribution
        run: python setup.py sdist
      - name: Artifacts list
        run: ls -l dist
      - name: Store the source distribution
        uses: actions/upload-artifact@v4
        with:
          name: python-package-distributions-source
          path: dist/*.tar.gz

  publish:
    needs:
      - macos-built-distributions
      - pure-built-distributions
      - source-distribution
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Download all the dists
        uses: actions/download-artifact@v4
        with:
          pattern: python-package-distributions-*
          merge-multiple: true
          path: dist/
      - name: What will we publish?
        run: ls -l dist
      - name: Publish
        if: github.event.inputs.branch != ''
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}
          skip-existing: true
