# 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
  PHP_VERSION: 8.4

permissions:
  contents: read

jobs:
  coding-guidelines:
    name: Coding Guidelines

    runs-on: ubuntu-latest
    timeout-minutes: 5

    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.sha }}

      - name: Use local branch
        shell: bash
        run: |
          BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}")
          git branch -D $BRANCH 2>/dev/null || true
          git branch $BRANCH HEAD
          git checkout $BRANCH

      - name: Install PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ env.PHP_VERSION }}
          coverage: none
          tools: 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
    timeout-minutes: 5

    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.sha }}

      - name: Use local branch
        shell: bash
        run: |
          BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}")
          git branch -D $BRANCH 2>/dev/null || true
          git branch $BRANCH HEAD
          git checkout $BRANCH

      - name: Install PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ env.PHP_VERSION }}
          coverage: none
          tools: 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
    timeout-minutes: 5

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

    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.sha }}

      - name: Use local branch
        shell: bash
        run: |
          BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}")
          git branch -D $BRANCH 2>/dev/null || true
          git branch $BRANCH HEAD
          git checkout $BRANCH

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

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

      - name: Cache Composer cache directory
        uses: actions/cache@v4
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

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

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

  code-coverage:
    name: Code Coverage

    needs:
      - tests

    runs-on: ubuntu-latest
    timeout-minutes: 5

    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.sha }}

      - name: Use local branch
        shell: bash
        run: |
          BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}")
          git branch -D $BRANCH 2>/dev/null || true
          git branch $BRANCH HEAD
          git checkout $BRANCH

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

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

      - name: Cache Composer cache directory
        uses: actions/cache@v4
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

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

      - name: Collect code coverage with PHPUnit
        run: vendor/bin/phpunit --log-junit test-results.xml --coverage-clover=code-coverage.xml

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

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