name: PHPUnit

on:
  push:
    branches:
      - '*.x'
  pull_request:
    branches:
      - '*.x'

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        php: ['7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.5']
        dependency-version: [prefer-lowest, prefer-stable]
        exclude:
          # PHPUnit 12 has compatibility issues with prefer-lowest on multiple PHP versions
          - php: '8.1'
            dependency-version: prefer-lowest
          - php: '8.2'
            dependency-version: prefer-lowest
          - php: '8.3'
            dependency-version: prefer-lowest
          - php: '8.4'
            dependency-version: prefer-lowest
          - php: '8.5'
            dependency-version: prefer-lowest

    name: P${{ matrix.php }} - ${{ matrix.dependency-version }}

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

    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: ${{ matrix.php }}
        extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, json
        coverage: none

    - name: Setup problem matchers
      run: |
        echo "::add-matcher::${{ runner.tool_cache }}/php.json"
        echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

    - name: Cache Composer packages
      id: composer-cache
      uses: actions/cache@v3
      with:
        path: vendor
        key: ${{ runner.os }}-php-${{ matrix.php }}-${{ hashFiles('**/composer.lock') }}
        restore-keys: |
          ${{ runner.os }}-php-${{ matrix.php }}-

    - name: Configure platform for PHP 8.5
      if: matrix.php == '8.5'
      run: composer config platform.php 8.4.0

    - name: Install dependencies
      run: composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-progress

    - name: List Installed Dependencies
      run: composer show -D

    - name: Execute tests
      run: vendor/bin/phpunit --no-coverage

  coverage:
    runs-on: ubuntu-latest
    name: Coverage

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

    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: 8.3
        extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, json
        coverage: xdebug3

    - name: Cache Composer packages
      id: composer-cache
      uses: actions/cache@v3
      with:
        path: vendor
        key: ${{ runner.os }}-php-8.3-${{ hashFiles('**/composer.lock') }}
        restore-keys: |
          ${{ runner.os }}-php-8.3-

    - name: Install dependencies
      run: composer install --prefer-dist --no-interaction --no-progress

    - name: Check Xdebug status
      run: php -m | grep -i xdebug

    - name: Execute tests with coverage
      run: |
        echo "Current working directory: $(pwd)"
        echo "PHPUnit command: vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover"
        export XDEBUG_MODE=coverage
        echo "Xdebug mode set to: $XDEBUG_MODE"
        vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
        echo "PHPUnit exit code: $?"

    - name: Check if coverage file was created
      run: |
        echo "Checking for coverage file..."
        echo "Current directory contents:"
        ls -la
        echo "Looking for clover files:"
        ls -la *.clover 2>/dev/null || echo "No clover files found in current directory"
        echo "Searching entire directory tree:"
        find . -name "*.clover" -type f 2>/dev/null || echo "No clover files found anywhere"
        echo "Checking if Xdebug coverage mode is working:"
        php -r "echo 'Xdebug mode: ' . (getenv('XDEBUG_MODE') ?: 'not set') . PHP_EOL;"

    - name: Upload coverage reports to Codecov
      uses: codecov/codecov-action@v5
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        files: coverage.clover
        fail_ci_if_error: false