---
name: Deploy

on:
  push:
    branches:
      - main
  pull_request:
    paths:
      - ".github/workflows/deploy.yml"
  release:
    types:
      - published
  workflow_dispatch:

env:
  FORCE_COLOR: 1

jobs:
  build-native-wheels:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-latest, macOS-latest, ubuntu-latest]

    steps:
      - uses: actions/checkout@v4
      - run: git fetch --prune --unshallow

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"
          cache: pip
          cache-dependency-path: ".github/workflows/deploy.yml"

      # https://github.com/pypa/cibuildwheel
      - name: Build wheels
        uses: pypa/cibuildwheel@v2.17.0
        with:
          output-dir: dist
        # Options are supplied via environment variables:
        env:
          # Build separate wheels for macOS's different architectures.
          CIBW_ARCHS_MACOS: "x86_64 arm64"
          # Build only on Linux architectures that don't need qemu emulation.
          CIBW_ARCHS_LINUX: "x86_64 i686"
          # Include latest Python beta.
          CIBW_PRERELEASE_PYTHONS: True
          # Run the test suite after each build.
          CIBW_TEST_REQUIRES: "pytest"
          CIBW_TEST_COMMAND: pytest {package}/tests

      - name: Upload as build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ matrix.os }}
          path: dist/*.whl

  build-QEMU-emulated-wheels:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        python-version:
          - pp39
          - pp310
          - cp38
          - cp39
          - cp310
          - cp311
          - cp312

    steps:
      - uses: actions/checkout@v4
      - run: git fetch --prune --unshallow

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"
          cache: pip
          cache-dependency-path: ".github/workflows/deploy.yml"

      # https://github.com/docker/setup-qemu-action
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      # https://github.com/pypa/cibuildwheel
      - name: Build wheels
        uses: pypa/cibuildwheel@v2.17.0
        with:
          output-dir: dist
        # Options are supplied via environment variables:
        env:
          # Build only the currently selected Linux architecture (so we can
          # parallelise for speed).
          CIBW_ARCHS_LINUX: "aarch64"
          # Likewise, select only one Python version per job to speed this up.
          CIBW_BUILD: "${{ matrix.python-version }}-*"
          # Include latest Python beta.
          CIBW_PRERELEASE_PYTHONS: True
          # Run the test suite after each build.
          CIBW_TEST_REQUIRES: "pytest"
          CIBW_TEST_COMMAND: pytest {package}/tests

      - name: Upload as build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: wheels-qemu-${{ matrix.python-version }}
          path: dist/*.whl

  build-sdist-and-upload:
    runs-on: ubuntu-latest
    needs: ['build-native-wheels', 'build-QEMU-emulated-wheels']
    permissions:
      # IMPORTANT: this permission is mandatory for trusted publishing
      id-token: write

    steps:
      - uses: actions/checkout@v4
      - run: |
            git fetch --prune --unshallow

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"
          cache: pip
          cache-dependency-path: "setup.py"

      - name: Install dependencies
        run: |
          python -m pip install -U pip
          python -m pip install -U build twine

      - name: Download wheels from build artifacts
        uses: actions/download-artifact@v4
        with:
          pattern: wheels-*
          merge-multiple: true
          path: dist-wheels/

      - name: Build package
        run: |
          git tag
          python -m build --sdist
          twine check --strict dist/*
          twine check --strict dist-wheels/*

      - name: Publish wheels to PyPI
        if: github.event.action == 'published'
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          packages-dir: dist-wheels/

      - name: Publish sdist to PyPI
        if: github.event.action == 'published'
        uses: pypa/gh-action-pypi-publish@release/v1

      - name: Publish wheels to TestPyPI
        if: |
          github.repository == 'ultrajson/ultrajson' &&
          github.ref == 'refs/heads/main'
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
          packages-dir: dist-wheels/

      - name: Publish sdist to TestPyPI
        if: |
          github.repository == 'ultrajson/ultrajson' &&
          github.ref == 'refs/heads/main'
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
