name: CI

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  testsuite:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        php-version: ['8.1', '8.4']
        db-type: ['sqlite', 'mysql', 'pgsql']
        prefer-lowest: ['']
        include:
          - php-version: '8.1'
            db-type: 'sqlite'
            prefer-lowest: 'prefer-lowest'

    services:
      postgres:
        image: postgres
        ports:
          - 5432:5432
        env:
          POSTGRES_PASSWORD: postgres

    steps:
      - uses: actions/checkout@v4

      - name: Setup Service
        if: matrix.db-type == 'mysql'
        run: |
          sudo service mysql start
          mysql -h 127.0.0.1 -u root -proot -e 'CREATE DATABASE cakephp;'

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          extensions: mbstring, intl, pdo_${{ matrix.db-type }}
          coverage: pcov

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

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: ${{ steps.composercache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ steps.key-date.outputs.date }}-${{ hashFiles('composer.json') }}-${{ matrix.prefer-lowest }}

      - name: Composer install
        run: |
          composer --version
          if ${{ matrix.prefer-lowest == 'prefer-lowest' }}
          then
            composer update --prefer-lowest --prefer-stable
            composer require --dev dereuromark/composer-prefer-lowest:dev-master
          else
            composer install --no-progress --prefer-dist --optimize-autoloader
          fi

      - name: Setup problem matchers for PHPUnit
        if: matrix.db-type == 'mysql'
        run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

      - name: Wait for MySQL
        if: matrix.db-type == 'mysql'
        run: while ! `mysqladmin ping -h 127.0.0.1 --silent`; do printf 'Waiting for MySQL...\n'; sleep 2; done;

      - name: Run PHPUnit
        run: |
          if [[ ${{ matrix.db-type }} == 'sqlite' ]]; then export DB_URL='sqlite:///:memory:'; fi
          if [[ ${{ matrix.db-type }} == 'mysql' ]]; then export DB_URL='mysql://root:root@127.0.0.1/cakephp?encoding=utf8'; fi
          if [[ ${{ matrix.db-type }} == 'pgsql' ]]; then export DB_URL='postgres://postgres:postgres@127.0.0.1/postgres'; fi
          if [[ ${{ matrix.php-version }} == '8.1' ]]; then
            vendor/bin/phpunit --coverage-clover=coverage.xml
          else
            vendor/bin/phpunit
          fi

      - name: Validate prefer-lowest
        if: matrix.prefer-lowest == 'prefer-lowest'
        run: vendor/bin/validate-prefer-lowest -m

#      - name: Upload coverage reports to Codecov
#        if: success() && matrix.php-version == '8.1'
#        uses: codecov/codecov-action@v4
#        with:
#          token: ${{ secrets.CODECOV_TOKEN }}

  validation:
    name: Coding Standard & Static Analysis
    runs-on: ubuntu-22.04

    steps:
      - uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          extensions: mbstring, intl
          coverage: none

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

      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: ${{ steps.composercache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ steps.key-date.outputs.date }}-${{ hashFiles('composer.json') }}-${{ matrix.prefer-lowest }}

      - name: Composer phpstan setup
        run: composer stan-setup

      - name: Run phpstan
        run: vendor/bin/phpstan analyse --error-format=github

      - name: Run phpcs
        run: composer cs-check