---
name: CI

"on": [push]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
      - id: tox-env
        run: |
          VERSION=${{ matrix.python-version }}
          echo "environment=${VERSION//.}" >> $GITHUB_OUTPUT
      - name: Cache LLVM and Clang
        id: cache-llvm
        uses: actions/cache@v4
        with:
          path: llvm/lib/libclang.so*
          key: llvm-17
      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@v2
        with:
          version: "17.0"
          cached: ${{ steps.cache-llvm.outputs.cache-hit }}
      - name: Symlink libclang.so
        run: sudo ln -s ${{ env.LLVM_PATH }}/lib/libclang.so /usr/lib/x86_64-linux-gnu/libclang-17.so
      - name: Install uv
        uses: astral-sh/setup-uv@v3
        with:
          version: "0.4.22"
          enable-cache: true
          cache-suffix: ${{ matrix.python-version }}
      - name: Install dependencies
        run: |
          uv tool install tox --with tox-uv
      - name: Test with tox
        run: |
          tox -e py${{ steps.tox-env.outputs.environment }}

  coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache LLVM and Clang
        id: cache-llvm
        uses: actions/cache@v4
        with:
          path: llvm/lib/libclang.so*
          key: llvm-17
      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@v2
        with:
          version: "17.0"
          cached: ${{ steps.cache-llvm.outputs.cache-hit }}
      - name: Symlink libclang.so
        run: sudo ln -s ${{ env.LLVM_PATH }}/lib/libclang.so /usr/lib/x86_64-linux-gnu/libclang-17.so
      - name: Install uv
        uses: astral-sh/setup-uv@v3
        with:
          version: "0.4.22"
          enable-cache: true
          cache-suffix: "coverage"
      - name: Install dependencies
        run: |
          uv tool install tox --with tox-uv
      - name: Test with tox
        run: |
          tox -e cov
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./coverage.xml
          verbose: true
          fail_ci_if_error: true

  check:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        check: ["pylint", "pycodestyle", "black", "mypy"]
    steps:
      - uses: actions/checkout@v4
      - name: Cache LLVM and Clang
        id: cache-llvm
        uses: actions/cache@v4
        with:
          path: llvm/lib/libclang.so*
          key: llvm-17
      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@v2
        with:
          version: "17.0"
          cached: ${{ steps.cache-llvm.outputs.cache-hit }}
      - name: Symlink libclang.so
        run: sudo ln -s ${{ env.LLVM_PATH }}/lib/libclang.so /usr/lib/x86_64-linux-gnu/libclang-17.so
      - name: Install uv
        uses: astral-sh/setup-uv@v3
        with:
          version: "0.4.22"
          enable-cache: true
          cache-suffix: "check"
      - name: Install dependencies
        run: |
          uv tool install tox --with tox-uv
      - name: Static code checks
        run: |
          tox -e check-${{ matrix.check }}

  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Cache LLVM and Clang
        id: cache-llvm
        uses: actions/cache@v4
        with:
          path: llvm/lib/libclang.so*
          key: llvm-17
      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@v2
        with:
          version: "17.0"
          cached: ${{ steps.cache-llvm.outputs.cache-hit }}
      - name: Symlink libclang.so
        run: sudo ln -s ${{ env.LLVM_PATH }}/lib/libclang.so /usr/lib/x86_64-linux-gnu/libclang-17.so
      - name: Install uv
        uses: astral-sh/setup-uv@v3
        with:
          version: "0.4.22"
          enable-cache: true
          cache-suffix: "docs"
      - name: Install dependencies
        run: |
          uv tool install tox --with tox-uv
      - name: Build docs
        run: |
          tox -e docs
  sphinx:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        sphinx-version: ["four"]
    steps:
      - uses: actions/checkout@v4
      - name: Cache LLVM and Clang
        id: cache-llvm
        uses: actions/cache@v4
        with:
          path: llvm/lib/libclang.so*
          key: llvm-11
      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@v2
        with:
          version: "11.0"
          cached: ${{ steps.cache-llvm.outputs.cache-hit }}
      - name: Symlink libclang.so
        run: |
          sudo ln -s ${{ env.LLVM_PATH }}/lib/libclang.so /usr/lib/x86_64-linux-gnu/libclang-11.so
          sudo apt-get update
          sudo apt install libtinfo5
      - name: Install uv
        uses: astral-sh/setup-uv@v3
        with:
          version: "0.4.22"
          enable-cache: true
          cache-suffix: ${{ matrix.sphinx-version }}
      - name: Install dependencies
        run: |
          uv tool install tox --with tox-uv
      - name: Test with tox
        run: |
          tox -e sphinx-${{ matrix.sphinx-version }}