name: "CI"

on:
    pull_request:
    push:
        branches:
            - 'main'
    schedule:
        -   cron: '0 0 * * *'

env:
    PHPUNIT_FLAGS: "-v"
    SYMFONY_PHPUNIT_DIR: "$HOME/symfony-bridge/.phpunit"

jobs:
    coding-standards:
        name: "Coding Standards (${{ matrix.php-version }})"

        runs-on: "ubuntu-18.04"

        strategy:
            fail-fast: false
            matrix:
                php-version:
                    - '7.4'

        steps:
            -
                name: "Checkout code"
                uses: "actions/checkout@v2"

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

            -
                name: "Validate composer.json"
                run: "composer validate --strict --no-check-lock"

            -
                name: "Composer install"
                uses: "ramsey/composer-install@v2"
                with:
                    composer-options: "--no-scripts"

            -
                name: "Composer install php-cs-fixer"
                uses: "ramsey/composer-install@v2"
                with:
                    composer-options: "--no-scripts --working-dir=tools/php-cs-fixer"

            -
                name: "Run friendsofphp/php-cs-fixer"
                run: "tools/php-cs-fixer/vendor/bin/php-cs-fixer fix --dry-run --diff"

    test:
        name: "PHP ${{ matrix.php-version }} + @${{ matrix.symfony-version }} ${{ matrix.dependency-versions }} deps"

        runs-on: ubuntu-18.04

        services:
            mysql:
                image: mysql:5.7 # Update server_version in phpunit.xml.dist if this changes.
                env:
                    MYSQL_ROOT_PASSWORD: root
                    MYSQL_DATABASE: test_maker
                ports:
                    - 3306
                options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
            mercure:
                image: dunglas/mercure
                env:
                    SERVER_NAME: :1337
                    MERCURE_PUBLISHER_JWT_KEY: '!ChangeMe!'
                    MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeMe!'
                    MERCURE_EXTRA_DIRECTIVES: |
                        anonymous
                        cors_origins *
                ports:
                    - 1337:1337

        env:
            SYMFONY_VERSION: ${{ matrix.symfony-version }}
            MAKER_ALLOW_DEV_DEPS_IN_APP: ${{ matrix.allow-dev-deps-in-apps }}

        strategy:
            fail-fast: false
            matrix:
                php-version:
                    - '7.4'
                symfony-version:
                    - '4.4.*'
                dependency-versions: ['highest']
                allow-dev-deps-in-apps: ['0']
                include:
                    # testing lowest PHP version with LTS
                    - php-version: '7.1.3'
                      symfony-version: '4.4.*'
                      # not important - does not affect each app's dependencies
                      dependency-versions: 'highest'
                    # testing lowest php version with highest 5.x stable
                    - php-version: '7.2.5'
                      symfony-version: '4.4.*'
                      dependency-versions: 'lowest'
                    # testing bleeding edge PHP with highest 5.x stable
                    - php-version: '7.4'
                      symfony-version: '4.4.*'
                      dependency-versions: 'highest'
                      # temporarily needed until some packages support php 8.1
                      allow-dev-deps-in-apps: '1'

        steps:
            - name: "Checkout code"
              uses: actions/checkout@v2.3.3

            - name: "Start MySQL"
              run: |
                  sudo /etc/init.d/mysql start

            - name: "Verify MySQL connection from host"
              run: |
                  mysql --host 127.0.0.1 --port 3306 -uroot -proot -e "SHOW DATABASES;"

            - name: "Setup Database"
              run: |
                  mysql --host 127.0.0.1 --port 3306 -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test_maker;"

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

            - name: "Add PHPUnit matcher"
              run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

            - name: "Allow flex globally"
              run: composer global config --no-plugins allow-plugins.symfony/flex true

            - name: "Require symfony/flex"
              run: composer global require --no-progress --no-scripts --no-plugins symfony/flex

            - name: "Composer Validate"
              run: composer validate -vvv

            - name: "Composer install"
              uses: "ramsey/composer-install@v2"
              with:
                  dependency-versions: "${{ matrix.dependency-versions }}"
                  composer-options: "-vvv"

            - name: "Composer install php-cs-fixer"
              uses: "ramsey/composer-install@v2"
              with:
                  composer-options: "--no-scripts --working-dir=tools/php-cs-fixer -vvv"

            - name: "Composer install twigcs"
              uses: "ramsey/composer-install@v2"
              with:
                  composer-options: "--no-scripts --working-dir=tools/twigcs -vvv"

            - name: "Install PHPUnit"
              run: vendor/bin/simple-phpunit install

            - name: "PHPUnit version"
              run: vendor/bin/simple-phpunit --version

            - name: "Run tests"
              run: vendor/bin/simple-phpunit ${{ env.PHPUNIT_FLAGS }}
