name: Upload component to Python Package Index

on:
  workflow_dispatch:
    inputs:
      release:
        type: boolean
        default: false
        required: false
        description: "Release? If false, publish to test.pypi.org, if true, publish to pypi.org"

permissions:
  contents: read

jobs:
  linux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target: [x86_64, x86, aarch64, armv7, s390x, ppc64le]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Build wheels
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          args: --release --out dist --find-interpreter
          sccache: 'true'
          manylinux: auto
          working-directory: bindings/python
      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ runner.os }}-${{ matrix.target }}
          path: bindings/python/dist

  windows:
    runs-on: windows-latest
    strategy:
      matrix:
        target: [x64, x86]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.10'
          architecture: ${{ matrix.target }}
      - name: Build wheels
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          args: --release --out dist --find-interpreter
          sccache: 'true'
          working-directory: bindings/python
      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ runner.os }}-${{ matrix.target }}
          path: bindings/python/dist

  macos:
    runs-on: macos-latest
    strategy:
      matrix:
        target: [x86_64, aarch64]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Build wheels
        uses: PyO3/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          args: --release --out dist --find-interpreter
          sccache: 'true'
          working-directory: bindings/python
      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ runner.os }}-${{ matrix.target }}
          path: bindings/python/dist

  sdist:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build sdist
        uses: PyO3/maturin-action@v1
        with:
          command: sdist
          args: --out dist
          working-directory: bindings/python
      - name: Upload sdist
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ runner.os }}-sdist
          path: bindings/python/dist

  publish-to-test-pypi:
    if: ${{ github.event.inputs.release != 'true' }}
    name: >-
        Publish Python 🐍 distribution 📦 to Test PyPI
    runs-on: ubuntu-latest
    needs: [linux, windows, macos, sdist]
    steps:
      - uses: actions/download-artifact@v4
        with:
          path: bindings/python/
      - name: Publish distribution 📦 to Test PyPI
        uses: PyO3/maturin-action@v1
        env:
          MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TEST_API_TOKEN }}
          MATURIN_REPOSITORY_URL: "https://test.pypi.org/legacy/"
        with:
          command: upload
          args: "--skip-existing **/*.whl **/*.tar.gz"
          working-directory: bindings/python

  publish-pypi:
    if: ${{ github.event.inputs.release == 'true' }}
    name: >-
        Publish Python 🐍 distribution 📦 to PyPI
    runs-on: ubuntu-latest
    needs: [linux, windows, macos, sdist]
    steps:
      - uses: actions/download-artifact@v4
        with:
          path: bindings/python/
      - name: Publish distribution 📦 to PyPI
        uses: PyO3/maturin-action@v1
        env:
          MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
          MATURIN_REPOSITORY_URL: "https://upload.pypi.org/legacy/"
        with:
          command: upload
          args: "--skip-existing **/*.whl **/*.tar.gz"
          working-directory: bindings/python
