name: 'Lint Checker: PHP'
on:
  push:
    paths:
      - '**.php'
  pull_request:
    types: [opened, edited, reopened, ready_for_review]
    paths:
      - '**.php'
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}
  cancel-in-progress: true

jobs:
  phpcs:
    name: Run PHP Code Sniffer
    runs-on: ubuntu-latest
    steps:

      - name: Checkout
        uses: actions/checkout@v4

      # User PHP 7.4 here for compatibility with the WordPress codesniffer rules.
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.4'
          coverage: none
          tools: composer, cs2pr

      - uses: technote-space/get-diff-action@v6
        with:
          PATTERNS: |
            **/*.php

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

      - name: Cache Composer vendor directory
        uses: actions/cache@v3
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-
        if: "!! env.GIT_DIFF"

      - name: Validate composer.json and composer.lock
        run: composer validate
        if: "!! env.GIT_DIFF"

      - name: Install dependencies
        run: composer install --no-progress --optimize-autoloader --prefer-dist
        if: "!! env.GIT_DIFF"

      - name: Detecting PHP Code Standards Violations
        run: vendor/bin/phpcs --standard=phpcs.xml -s ${{ env.GIT_DIFF }}
        if: "!! env.GIT_DIFF"