# https://help.github.com/en/categories/automating-your-workflow-with-github-actions

on:
  - "pull_request"
  - "push"

name: "CI"

env:
  COMPOSER_ROOT_VERSION: "6.3.x-dev"

permissions:
  contents: read

jobs:
  coding-guidelines:
    name: Coding Guidelines

    runs-on: ubuntu-latest

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

      - name: Install PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          coverage: none

      - name: Run PHP-CS-Fixer
        run: ./tools/php-cs-fixer fix --dry-run --show-progress=dots --using-cache=no --verbose

  static-analysis:
    name: Static Analysis

    runs-on: ubuntu-latest

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

      - name: Install PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.3
          coverage: none

      - name: Install dependencies with Composer
        run: ./tools/composer update --no-interaction --no-ansi --no-progress

      - name: Run PHPStan
        run: ./tools/phpstan analyse --no-progress --error-format=github

  tests:
    name: Tests

    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        php-version:
          - "8.2"
          - "8.3"
          - "8.4"
          - "8.5"

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

      - name: "Install PHP with extensions"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-version }}"
          coverage: "xdebug"

      - name: "Install dependencies with Composer"
        run: "./tools/composer update --no-ansi --no-interaction --no-progress"

      - name: "Run tests with PHPUnit"
        run: "vendor/bin/phpunit --log-junit junit.xml --coverage-clover=coverage.xml"

      - name: Upload test results to Codecov.io
        if: ${{ !cancelled() }}
        uses: codecov/test-results-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

      - name: Upload code coverage data to Codecov.io
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
