name: "build"

on:
  pull_request:
    paths-ignore:
      - ".docs/**"
  push:
    branches:
      - "*"
  schedule:
    - cron: "0 8 * * 1" # At 08:00 on Monday

env:
  extensions: "json"
  cacheVersion: "1"
  composerVersion: "v2"
  composerInstall: "composer install"

jobs:
  qa:
    name: "Quality Assurance"
    runs-on: "${{ matrix.operating-system }}"

    strategy:
      matrix:
        php-versions: [ "8.0" ]
        operating-system: [ "ubuntu-latest" ]
      fail-fast: false

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

      - name: "Setup PHP cache environment"
        id: "extcache"
        uses: "shivammathur/cache-extensions@v1"
        with:
          php-version: "${{ matrix.php-versions }}"
          extensions: "${{ env.extensions }}"
          key: "${{ env.cacheVersion }}"

      - name: "Cache PHP extensions"
        uses: "actions/cache@v2"
        with:
          path: "${{ steps.extcache.outputs.dir }}"
          key: "${{ steps.extcache.outputs.key }}"
          restore-keys: "${{ steps.extcache.outputs.key }}"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-versions }}"
          extensions: "${{ env.extensions }}"
          tools: "composer:${{ env.composerVersion }} "

      - name: "Setup problem matchers for PHP"
        run: 'echo "::add-matcher::${{ runner.tool_cache }}/php.json"'

      - name: "Get Composer cache directory"
        id: "composercache"
        run: 'echo "::set-output name=dir::$(composer config cache-files-dir)"'

      - name: "Cache PHP dependencies"
        uses: "actions/cache@v2"
        with:
          path: "${{ steps.composercache.outputs.dir }}"
          key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}"
          restore-keys: "${{ runner.os }}-composer-"

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

      - name: "Install dependencies"
        run: "${{ env.composerInstall }}"

      - name: "Coding Standard"
        run: "make cs"

  static-analysis:
    name: "Static analysis"
    runs-on: "${{ matrix.operating-system }}"

    strategy:
      matrix:
        php-versions: [ "8.0" ]
        operating-system: [ "ubuntu-latest" ]
      fail-fast: false

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

      - name: "Setup PHP cache environment"
        id: "extcache"
        uses: "shivammathur/cache-extensions@v1"
        with:
          php-version: "${{ matrix.php-versions }}"
          extensions: "${{ env.extensions }}"
          key: "${{ env.cacheVersion }}"

      - name: "Cache PHP extensions"
        uses: "actions/cache@v2"
        with:
          path: "${{ steps.extcache.outputs.dir }}"
          key: "${{ steps.extcache.outputs.key }}"
          restore-keys: "${{ steps.extcache.outputs.key }}"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-versions }}"
          extensions: "${{ env.extensions }}"
          tools: "composer:${{ env.composerVersion }} "

      - name: "Setup problem matchers for PHP"
        run: 'echo "::add-matcher::${{ runner.tool_cache }}/php.json"'

      - name: "Get Composer cache directory"
        id: "composercache"
        run: 'echo "::set-output name=dir::$(composer config cache-files-dir)"'

      - name: "Cache PHP dependencies"
        uses: "actions/cache@v2"
        with:
          path: "${{ steps.composercache.outputs.dir }}"
          key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}"
          restore-keys: "${{ runner.os }}-composer-"

      - name: "Install dependencies"
        run: "${{ env.composerInstall }}"

      - name: "PHPStan"
        run: "make phpstan"

  tests:
    name: "Tests"
    runs-on: "${{ matrix.operating-system }}"

    strategy:
      matrix:
        php-versions: [ "8.0" ]
        operating-system: [ "ubuntu-latest" ]
      fail-fast: false

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

      - name: "Setup PHP cache environment"
        id: "extcache"
        uses: "shivammathur/cache-extensions@v1"
        with:
          php-version: "${{ matrix.php-versions }}"
          extensions: "${{ env.extensions }}"
          key: "${{ env.cacheVersion }}"

      - name: "Cache PHP extensions"
        uses: "actions/cache@v2"
        with:
          path: "${{ steps.extcache.outputs.dir }}"
          key: "${{ steps.extcache.outputs.key }}"
          restore-keys: "${{ steps.extcache.outputs.key }}"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-versions }}"
          extensions: "${{ env.extensions }}"
          tools: "composer:${{ env.composerVersion }} "

      - name: "Setup problem matchers for PHP"
        run: 'echo "::add-matcher::${{ runner.tool_cache }}/php.json"'

      - name: "Get Composer cache directory"
        id: "composercache"
        run: 'echo "::set-output name=dir::$(composer config cache-files-dir)"'

      - name: "Cache PHP dependencies"
        uses: "actions/cache@v2"
        with:
          path: "${{ steps.composercache.outputs.dir }}"
          key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}"
          restore-keys: "${{ runner.os }}-composer-"

      - name: "Install dependencies"
        run: "${{ env.composerInstall }}"

      - name: "Setup problem matchers for PHPUnit"
        run: 'echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"'

      - name: "Tests"
        run: "make tests"
