name: Tests

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - master
      - develop

env:
  FORCE_COLOR: 3

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  clang-tidy:
    name: Clang-Tidy
    runs-on: ubuntu-latest
    container: silkeh/clang:20

    steps:
      - name: Install requirements
        run: apt-get update && apt-get install -y python3-dev python3-pip git ninja-build

      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: true

      - name: Install extra requirements
        run: python3 -m pip install setuptools_scm --break-system-packages

      - name: Configure
        run: cmake --preset tidy

      - name: Build
        run: cmake --build --preset tidy

  pylint:
    runs-on: ubuntu-latest
    name: PyLint

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: true

      - name: Run PyLint
        run: pipx run nox[uv] -s pylint -- --output-format=github

  cmake:
    name: CMake 🐍 ${{ matrix.python-version }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - python-version: "3.10"
            cmake-extras: "-DCMAKE_CXX_STANDARD=17"
          - python-version: "3.11"
          - python-version: "3.14"
          - python-version: "3.14t"
          - python-version: "pypy3.11"

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: true

      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python-version }}
          allow-prereleases: true

      - uses: rui314/setup-mold@v1

      - uses: astral-sh/setup-uv@v7

      - uses: hendrikmuhs/ccache-action@v1.2
        with:
          key: ${{ matrix.python-version }}
          create-symlink: true

      - name: Install python tools
        run: uv pip install --system --python=python --group github

      - name: Configure
        run: cmake --preset default ${{ matrix.cmake-extras }}

      - name: Build
        run: cmake --build --preset default

      - name: Test
        run: ctest --preset default -j 4

  build_wheels:
    name: ${{ matrix.only }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            only: cp314t-manylinux_x86_64
          - os: ubuntu-24.04-arm
            only: cp313-manylinux_aarch64
          - os: windows-latest
            only: cp310-win32
          - os: windows-latest
            only: cp313-win_amd64
          - os: macos-15-intel
            only: cp314t-macosx_x86_64
          - os: macos-latest
            only: cp312-macosx_arm64
          - os: windows-11-arm
            only: cp311-win_arm64
          - os: ubuntu-latest
            only: gp311_242-manylinux_x86_64

    steps:
      - uses: actions/checkout@v6
        with:
          submodules: true
          fetch-depth: 0

      - uses: astral-sh/setup-uv@v7

      - uses: pypa/cibuildwheel@v3.3
        with:
          only: "${{ matrix.only }}"

      - uses: actions/upload-artifact@v6
        with:
          path: wheelhouse/*
          name: test-wheels-${{ strategy.job-index }}

      - name: Check wheels
        run: pipx run twine check wheelhouse/*
        shell: bash

  pass:
    if: always()
    needs: [clang-tidy, pylint, cmake, build_wheels]
    runs-on: ubuntu-slim
    steps:
      - uses: re-actors/alls-green@release/v1
        with:
          jobs: ${{ toJSON(needs) }}
