name: Build and upload to PyPI

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main
  release:
    types:
      - published

permissions: {}

jobs:
  build_wheels:
    name: Build wheels for ${{ matrix.os }}
    runs-on: ${{ matrix.runs-on }}
    strategy:
      matrix:
        os:
          - android-arm
          - android-intel
          - ios
          - linux-arm
          - linux-intel
          - macos-arm
          - macos-intel
          - windows-arm
          - windows-intel
        include:
          - archs: auto
            platform: auto
          - os: android-intel
            runs-on: ubuntu-latest
            platform: android
          - os: android-arm
            runs-on: macos-latest
            platform: android
          - os: ios
            runs-on: macos-latest
            platform: ios
          - os: linux-arm
            runs-on: ubuntu-24.04-arm
          - os: linux-intel
            runs-on: ubuntu-latest
          - os: macos-intel
            # macos-13 was the last x86_64 runner
            runs-on: macos-13
          - os: macos-arm
            # macos-14+ (including latest) are ARM64 runners
            runs-on: macos-latest
            archs: auto,universal2
          - os: windows-arm
            runs-on: windows-11-arm
          - os: windows-intel
            runs-on: windows-latest

    steps:
      - uses: actions/checkout@v5
        with:
          submodules: true
          persist-credentials: false

      # GitHub Actions can't currently run the Android emulator on macOS.
      - name: Skip Android tests on macOS
        if: matrix.os == 'android-arm'
        run: echo "CIBW_TEST_COMMAND=" >> "$GITHUB_ENV"

      # https://github.blog/changelog/2024-04-02-github-actions-hardware-accelerated-android-virtualization-now-available/
      - name: Enable KVM for Android emulator
        if: matrix.os == 'android-intel'
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm

      - name: Build wheels
        uses: pypa/cibuildwheel@9c00cb4f6b517705a3794b22395aedc36257242c # 3.2.1
        env:
          CIBW_ENABLE: pypy pypy-eol
          CIBW_PLATFORM: ${{ matrix.platform }}
          CIBW_ARCHS: ${{ matrix.archs || 'auto' }}
          MAXMINDDB_REQUIRE_EXTENSION: 1

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

  build_sdist:
    name: Build source distribution
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          submodules: true
          persist-credentials: false

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

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

  upload_pypi:
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    environment: release
    permissions:
      id-token: write
    if: github.event_name == 'release' && github.event.action == 'published'
    steps:
      - uses: actions/download-artifact@v5
        with:
          pattern: maxminddb-*
          path: dist
          merge-multiple: true

      - uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # 1.13.0
