name: Publish to PyPI

on:
  release:
    types: [published]

permissions:
  contents: read

jobs:
  main:
    name: sdist + pure wheel
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up latest Python
        uses: actions/setup-python@v4
        with:
          python-version: "*"

      - name: Install latest pip, build, twine
        run: |
          python -m pip install --upgrade --disable-pip-version-check pip
          python -m pip install --upgrade build twine

      - name: Build wheel and source distributions
        run: python -m build

      - name: Upload to PyPI via Twine
        env:
          TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
        run: twine upload --verbose -u '__token__' dist/*

  mypyc:
    name: mypyc wheels (${{ matrix.name }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            name: linux-x86_64
          - os: windows-2019
            name: windows-amd64
          - os: macos-11
            name: macos-x86_64
            macos_arch: "x86_64"
          - os: macos-11
            name: macos-arm64
            macos_arch: "arm64"
          - os: macos-11
            name: macos-universal2
            macos_arch: "universal2"

    steps:
      - uses: actions/checkout@v3

      - name: Build wheels via cibuildwheel
        uses: pypa/cibuildwheel@v2.10.2
        env:
          CIBW_ARCHS_MACOS: "${{ matrix.macos_arch }}"

      - name: Upload wheels as workflow artifacts
        uses: actions/upload-artifact@v3
        with:
          name: ${{ matrix.name }}-mypyc-wheels
          path: ./wheelhouse/*.whl

      - name: Upload wheels to PyPI via Twine
        env:
          TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
        run: pipx run twine upload --verbose -u '__token__' wheelhouse/*.whl

  update-stable-branch:
    name: Update stable branch
    needs: [main, mypyc]
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - name: Checkout stable branch
        uses: actions/checkout@v3
        with:
          ref: stable
          fetch-depth: 0

      - name: Update stable branch to release tag & push
        run: |
          git reset --hard ${{ github.event.release.tag_name }}
          git push
