name: CI

on:
    pull_request: ~
    push:
        branches:
            - 1.x
        tags:
            - '*'
    schedule:
        - cron: 0 13 * * MON,TUE

jobs:
    coverage:
        name: Coverage
        runs-on: ubuntu-latest
        if: github.event_name != 'schedule'
        steps:
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: 8.2
                  extensions: exif, dom, fileinfo, filter, gd, hash, intl, json, mbstring, pcre, pdo, zlib
                  coverage: pcov

            - name: Checkout
              uses: actions/checkout@v4
              with:
                  show-progress: false

            - name: Install the dependencies
              uses: ramsey/composer-install@v3

            - name: Generate the coverage report
              run: php -d pcov.enabled=1 vendor/bin/phpunit --coverage-clover=clover.xml --colors=always

            - name: Upload the coverage report
              uses: codecov/codecov-action@v4
              with:
                  file: ./clover.xml
                  fail_ci_if_error: true
                  token: ${{ secrets.CODECOV_TOKEN }}

    coding-style:
        name: Coding Style
        runs-on: ubuntu-latest
        if: github.event_name == 'pull_request'
        steps:
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: 8.2
                  extensions: exif, dom, fileinfo, filter, gd, hash, intl, json, mbstring, pcre, pdo, zlib
                  coverage: none

            - name: Checkout
              uses: actions/checkout@v4
              with:
                  show-progress: false

            - name: Install the dependencies
              uses: ramsey/composer-install@v3

            - name: Install ECS
              uses: ramsey/composer-install@v3
              with:
                  working-directory: tools/ecs

            - name: Check the coding style
              run: tools/ecs/vendor/bin/ecs check src tests --config tools/ecs/config/default.php --no-progress-bar --ansi

            - name: Install PHPStan
              uses: ramsey/composer-install@v3
              with:
                  working-directory: tools/phpstan

            - name: Analyze the code
              run: tools/phpstan/vendor/bin/phpstan analyse --no-progress

    tests:
        name: PHP ${{ matrix.php }}
        runs-on: ubuntu-latest
        if: github.event_name != 'push'
        strategy:
            fail-fast: false
            matrix:
                php: [7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3]
        steps:
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: ${{ matrix.php }}
                  extensions: exif, dom, fileinfo, filter, gd, hash, intl, json, mbstring, pcre, pdo_mysql, zlib
                  coverage: none

            - name: Checkout
              uses: actions/checkout@v4
              with:
                  show-progress: false

            - name: Install the dependencies
              uses: ramsey/composer-install@v3

            - name: Run the unit tests
              run: vendor/bin/phpunit --colors=always

    nightly:
        name: PHP 8.4
        runs-on: ubuntu-latest
        continue-on-error: true
        if: github.event_name != 'push'
        steps:
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: 8.3
                  extensions: exif, dom, fileinfo, filter, gd, hash, intl, json, mbstring, pcre, pdo_mysql, zlib
                  coverage: none

            - name: Checkout
              uses: actions/checkout@v4
              with:
                  show-progress: false

            - name: Install the dependencies
              uses: ramsey/composer-install@v3
              with:
                  composer-options: --ignore-platform-req=php+

            - name: Run the unit tests
              run: vendor/bin/phpunit --colors=always

    prefer-lowest:
        name: Prefer Lowest PHP ${{ matrix.php }}
        runs-on: ubuntu-latest
        if: github.event_name != 'push'
        strategy:
            fail-fast: false
            matrix:
                php: [7.2, 7.4, 8.0]
        steps:
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: ${{ matrix.php }}
                  extensions: exif, dom, fileinfo, filter, gd, hash, intl, json, mbstring, pcre, pdo_mysql, zlib
                  coverage: none

            - name: Checkout
              uses: actions/checkout@v4
              with:
                  show-progress: false

            - name: Install the dependencies
              run: |
                  if [ "${{ matrix.php }}" = "8" ]; then composer require contao/imagine-svg:1.0.2 --no-update; fi
                  composer update --prefer-lowest --prefer-stable --no-interaction --no-suggest --no-progress

            - name: Run the unit tests
              run: vendor/bin/phpunit --colors=always

    windows:
        name: Windows PHP ${{ matrix.php }}
        runs-on: windows-latest
        if: github.event_name != 'push'
        strategy:
            fail-fast: false
            matrix:
                php: [7.2, 7.3, 7.4, 8.0, 8.1, 8.2]
        steps:
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: ${{ matrix.php }}
                  extensions: exif, dom, fileinfo, filter, gd, hash, intl, json, mbstring, pcre, pdo_mysql, zlib
                  ini-values: memory_limit=1G
                  coverage: none

            - name: Adjust the Git autocrlf setting
              run: git config --global core.autocrlf false

            - name: Checkout
              uses: actions/checkout@v4
              with:
                  show-progress: false

            - name: Install the dependencies
              uses: ramsey/composer-install@v3

            - name: Run the unit tests
              run: vendor/bin/phpunit.bat --colors=always
