name: Build

on:
    pull_request: ~
    push: ~

jobs:
    phpstan:
        runs-on: ubuntu-24.04
        name: PHPStan
        steps:
            - name: Checkout
              uses: actions/checkout@v4
            - name: Run PHPStan
              uses: docker://oskarstark/phpstan-ga:1.8.0
              env:
                  REQUIRE_DEV: true
              with:
                  args: analyse
    cs-fixer:
        runs-on: ubuntu-24.04
        name: PHP-CS-Fixer
        steps:
            - name: Checkout
              uses: actions/checkout@v4
            - name: Run PHP-CS-Fixer
              uses: docker://oskarstark/php-cs-fixer-ga
              with:
                args: --diff --dry-run

    twig-cs-fixer:
        runs-on: ubuntu-24.04
        name: Twig-CS-Fixer
        steps:
            - name: Checkout
              uses: actions/checkout@v4
            - name: Require the vendor
              run: composer require --dev --no-update vincentlanglet/twig-cs-fixer ^3.4
            - name: Update
              run: composer update --no-interaction --no-progress
            - name: Run
              run: vendor/bin/twig-cs-fixer lint templates

    tests:
        runs-on: ubuntu-24.04
        strategy:
            matrix:
                php:
                  - '8.1'
                  - '8.2'
                  - '8.3'
                  - '8.4'
                dependency:
                  - ''
                symfony:
                  - '6.4.*'
                  - '7.1.*'
                  - '7.2.*'
                include:
                  - php: '8.1'
                    symfony: '6.4.*'
                    dependency: 'lowest'
                  - php: '8.2'
                    symfony: '7.0.*'
                    dependency: 'lowest'
                exclude:
                  - php: '8.1'
                    symfony: '7.1.*'
                  - php: '8.1'
                    symfony: '7.2.*'
        name: PHPUnit PHP ${{ matrix.php }} ${{ matrix.dependency }} (Symfony ${{ matrix.symfony }})
        steps:
            - name: Checkout
              uses: actions/checkout@v4

            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                php-version: ${{ matrix.php }}
                tools: flex

            - name: Get Composer cache directory
              id: composer-cache
              run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

            - name: Cache dependencies
              uses: actions/cache@v4
              with:
                path: ${{ steps.composer-cache.outputs.dir }}
                key: ${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }}
                restore-keys: ${{ matrix.php }}-composer-

            - name: Update project dependencies
              if: matrix.dependency == ''
              run: composer update --no-progress --ansi --prefer-stable
              env:
                SYMFONY_REQUIRE: ${{ matrix.symfony }}

            - name: Update project dependencies lowest
              if: matrix.dependency == 'lowest'
              run: composer update --no-progress --ansi --prefer-stable --prefer-lowest
              env:
                SYMFONY_REQUIRE: ${{ matrix.symfony }}

            - name: Validate composer
              run: composer validate --strict --no-check-lock

            - name: Run tests
              run: vendor/bin/phpunit

