name: Check

# Run this workflow every time a new commit pushed to your repository
on:
    push:
        tags-ignore:
            - "*"
        branches-ignore:
            - 'translations'
    pull_request:
        branches-ignore:
            - 'translations'
    # Allow manually triggering the workflow.
    workflow_dispatch:

jobs:
    changes:
        name: 🔍 Detect changes
        runs-on: ubuntu-latest
        outputs:
            php: ${{ steps.filter.outputs.php }}
        steps:
            - name: Checkout code
              uses: actions/checkout@v4

            - name: Check for file changes
              uses: dorny/paths-filter@v3
              id: filter
              with:
                  filters: |
                      php:
                          - 'app/**'
                          - 'config/**'
                          - 'database/**'
                          - 'routes/**'
                          - 'tests/**'
                          - 'composer.json'
                          - 'composer.lock'
                          - 'phpunit.xml'

    kill_previous:
        name: 0️⃣ Kill previous runs
        runs-on: ubuntu-latest
        # We want to run on external PRs, but not on our own internal PRs as they'll be run by the push to the branch.
        if: (github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository)
        steps:
            - name: Cancel Previous Runs
              uses: styfle/cancel-workflow-action@0.12.1
              with:
                  access_token: ${{ github.token }}

    php_syntax_errors:
        name: 1️⃣ PHP Code Style errors
        runs-on: ubuntu-latest
        needs:
            - kill_previous
            - changes
        if: needs.changes.outputs.php == 'true'
        steps:
            - name: Set up PHP
              uses: shivammathur/setup-php@v2
              with:
                  php-version: 8.4

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

            - name: Install dependencies
              uses: ramsey/composer-install@v2

            - name: Check source code for syntax errors
              run: ./vendor/bin/pint --test

    tests:
        name: 2️⃣ PHP ${{ matrix.php-version }} Tests
        needs:
            - php_syntax_errors
            - changes
        if: needs.changes.outputs.php == 'true'
        runs-on: ubuntu-latest
        strategy:
            matrix:
                php-version:
                    - 8.4
        env:
            extensions: bcmath, curl, dom, gd, imagick, json, libxml, mbstring, pcntl, pdo, pdo_mysql, zip

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

            - name: Setup PHP Action
              uses: shivammathur/setup-php@v2
              with:
                  php-version: ${{ matrix.php-version }}
                  extensions: ${{ env.extensions }}
                  coverage: xdebug
                  tools: pecl, composer

            - name: Install Composer dependencies
              uses: ramsey/composer-install@v2

            - name: Use Node.js 24
              uses: actions/setup-node@v4
              with:
                  node-version: 24

            - name: Install
              run: npm install

            - name: Compile Front-end
              run: npm run build

            - name: Apply tests ${{ matrix.php-version }}
              run: php artisan test
