on:
  pull_request:
    branches:
      - '*'
  push:
    branches:
      - 'master'
    tags:
      - 'v*'

jobs:
  test:
    name: Run Tests (${{ matrix.os }} / PHP ${{ matrix.php }})

    runs-on: ${{ matrix.os }}

    continue-on-error: ${{ matrix.experimental }}

    strategy:
      fail-fast: false
      matrix:
        php: ['7.4', '8.0', '8.1']
        os: [ubuntu-latest]
        experimental: [false]
        include:
          - php: nightly
            os: ubuntu-latest
            experimental: true
          - php: '8.1'
            os: windows-latest
            experimental: false
          # Not running on MacOS since it currently doesn't stop
          # - php: 8.1
          #   os: macos-latest
          #   experimental: false

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
      - name: SetUp PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '${{ matrix.php }}'
          tools: phpunit
          coverage: xdebug
          extensions: xdebug
      - name: Get composer cache directory
        id: composercache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
      - name: Cache Deps
        uses: actions/cache@v3
        id: cache
        with:
          path: ${{ steps.composercache.outputs.dir }}
          key: deps-${{ runner.os }}-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            deps-${{ runner.os }}-${{ matrix.php }}-composer-
            deps-${{ runner.os }}-${{ matrix.php }}-
            deps-${{ matrix.php }}-
            deps-
      - name: Install Deps
        if: matrix.php != 'nightly'
        run: composer install --prefer-dist
      - name: Install Deps (ignore PHP requirement)
        if: matrix.php == 'nightly'
        run: composer install --prefer-dist --ignore-platform-req=php+
      - name: Run PHPUnit
        run: php ./vendor/bin/phpunit --coverage-clover=coverage.clover.xml
      - name: Upload coverage results to Coveralls
        env:
          COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          COVERALLS_PARALLEL: true
          COVERALLS_FLAG_NAME: ${{ runner.os }}-${{ matrix.php }}
        run: php ./vendor/bin/php-coveralls --coverage_clover=coverage.clover.xml --json_path=coveralls-upload.json -v
        continue-on-error: ${{ matrix.experimental }}

  mark_coverage_done:
    needs: ['test']

    runs-on: ubuntu-latest

    steps:
    - name: Coveralls Finished
      uses: coverallsapp/github-action@master
      with:
        github-token: ${{ secrets.github_token }}
        parallel-finished: true

  psalm:
    name: Run Psalm (${{ matrix.os }} / PHP ${{ matrix.php }})

    strategy:
      fail-fast: false
      matrix:
        php: ['8.1']
        os: ['ubuntu-latest']

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
      - name: Get composer cache directory
        id: composercache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"
      - name: Cache Deps
        uses: actions/cache@v3
        id: cache
        with:
          path: ${{ steps.composercache.outputs.dir }}
          key: deps-${{ runner.os }}-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            deps-${{ runner.os }}-${{ matrix.php }}-composer-
            deps-${{ runner.os }}-${{ matrix.php }}-
            deps-${{ matrix.php }}-
            deps-
      - name: Install Deps
        run: composer install --prefer-dist
      - name: SetUp PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '${{ matrix.php }}'
      - name: Run Psalm
        run: php ./vendor/bin/psalm
