name: CI

on:
  push:
    branches: [main]
    paths:
      - '.sources/**'
      - '**.lock'
      - '**.nix'
  pull_request:
    paths:
      - '.sources/**'
      - '**.lock'
      - '**.nix'
  workflow_dispatch:

jobs:
  format:
    name: Format Nix files

    if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'

    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.PUSH_TOKEN }}

      - name: Set Git user info
        run: |
          git config user.name 'github-actions[bot]'
          git config user.email 'github-actions[bot]@users.noreply.github.com'

      - name: Get short revision
        id: rev
        run:
          echo "rev=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT"

      - name: Install Nix
        uses: cachix/install-nix-action@V27

      - name: Format changes
        run: |
          nix run \
            --inputs-from ./dev \
            'nixpkgs#nixfmt-rfc-style' -- .

      - name: Commit changes
        run: |
          if ! git diff --color=always --exit-code; then
            git commit -am "style: format ${{ steps.rev.outputs.rev }}"
            git push
          fi

  test:
    name: Test Modules

    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@V27

      - name: Setup cache
        uses: DeterminateSystems/magic-nix-cache-action@v7

      - name: Run tests
        run: |
          nix run \
            --inputs-from ./dev \
            github:Mic92/nix-fast-build -- \
            --no-nom \
            --flake "./dev#checks.$(nix eval --raw --impure --expr builtins.currentSystem)"

  validate-sources:
    name: Validate sources

    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@V27

      - name: Check for external repositories
        run: |
          set -e
          nix eval --file ./.github/checkSources.nix