name: CI

on:
  push:
  pull_request:

jobs:
  test:
    name: "PHPUnit: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}"
    continue-on-error: ${{ matrix.experimental }}

    strategy:
      matrix:
        include:
          - mw: 'REL1_43'
            php: '8.1'
            experimental: false
          - mw: 'REL1_44'
            php: '8.2'
            experimental: false
          - mw: 'REL1_45'
            php: '8.3'
            experimental: false
          - mw: 'master'
            php: '8.4'
            experimental: true
          - mw: 'master'
            php: '8.5'
            experimental: true

    runs-on: ubuntu-latest

    services:
      blazegraph:
        image: lyrasis/blazegraph:2.1.5
        ports:
          - "8889:8080"

    defaults:
      run:
        working-directory: mediawiki

    steps:
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: mbstring, intl
          tools: composer

      - name: Cache MediaWiki
        id: cache-mediawiki
        uses: actions/cache@v3
        with:
          path: |
            mediawiki
            !mediawiki/extensions/
            !mediawiki/vendor/
          key: mw_${{ matrix.mw }}-php${{ matrix.php }}_v4

      - name: Cache Composer cache
        uses: actions/cache@v3
        with:
          path: ~/.composer/cache
          key: composer-php${{ matrix.php }}

      - uses: actions/checkout@v4
        with:
            path: EarlyCopy

      - name: Install MediaWiki
        if: steps.cache-mediawiki.outputs.cache-hit != 'true'
        working-directory: ~
        run: bash EarlyCopy/.github/workflows/installMediaWiki.sh ${{ matrix.mw }} SPARQL

      - uses: actions/checkout@v4
        with:
          path: mediawiki/extensions/SPARQL

#      - name: Composer allow-plugins
#        run: composer config --no-plugins allow-plugins.composer/installers true

      - run: composer update

      - name: Run update.php
        run: php maintenance/update.php --quick

      - name: Load Blazegraph test data
        run: |
          curl -X POST --data-binary @extensions/SPARQL/demoData/Q2020028.ttl --header 'Content-Type:text/turtle' http://localhost:8889/bigdata/namespace/kb/sparql
          curl -X POST --data-binary @extensions/SPARQL/demoData/Q2291703.ttl --header 'Content-Type:text/turtle' http://localhost:8889/bigdata/namespace/kb/sparql
          curl -X POST --data-binary @extensions/SPARQL/demoData/Q2404825.ttl --header 'Content-Type:text/turtle' http://localhost:8889/bigdata/namespace/kb/sparql

      - name: Run PHPUnit
        run: php tests/phpunit/phpunit.php -c extensions/SPARQL/
        if: matrix.mw != 'master'

      - name: Run PHPUnit with code coverage
        run: php tests/phpunit/phpunit.php -c extensions/SPARQL/ --coverage-clover coverage.xml
        if: matrix.mw == 'master'

      - name: Upload code coverage
        run: bash <(curl -s https://codecov.io/bash)
        if: matrix.mw == 'master'

      - name: Run parser tests
        run: php tests/parser/parserTests.php --file=extensions/SPARQL/tests/parser/lua.txt




  PHPStan:
    name: "PHPStan: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}"

    strategy:
      matrix:
        include:
          - mw: 'REL1_43'
            php: '8.1'

    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: mediawiki

    steps:
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: mbstring
          tools: composer, cs2pr

      - name: Cache MediaWiki
        id: cache-mediawiki
        uses: actions/cache@v3
        with:
          path: |
            mediawiki
            mediawiki/extensions/
            mediawiki/vendor/
          key: mw_${{ matrix.mw }}-php${{ matrix.php }}_v3

      - name: Cache Composer cache
        uses: actions/cache@v3
        with:
          path: ~/.composer/cache
          key: composer_static_analysis

      - uses: actions/checkout@v4
        with:
            path: EarlyCopy

      - name: Install MediaWiki
        if: steps.cache-mediawiki.outputs.cache-hit != 'true'
        working-directory: ~
        run: bash EarlyCopy/.github/workflows/installMediaWiki.sh ${{ matrix.mw }} SPARQL

      - uses: actions/checkout@v4
        with:
          path: mediawiki/extensions/SPARQL

      - name: Composer allow-plugins
        run: composer config --no-plugins allow-plugins.composer/installers true

      - run: composer update

      - name: Composer install
        run: cd extensions/SPARQL && composer install --no-progress --no-interaction --prefer-dist --optimize-autoloader

      - name: PHPStan
        run: cd extensions/SPARQL && php vendor/bin/phpstan analyse --error-format=checkstyle --no-progress | cs2pr




  Psalm:
      name: "Psalm: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}"

      strategy:
        matrix:
          include:
            - mw: 'REL1_43'
              php: '8.1'

      runs-on: ubuntu-latest

      defaults:
          run:
              working-directory: mediawiki

      steps:
          - name: Setup PHP
            uses: shivammathur/setup-php@v2
            with:
                php-version: ${{ matrix.php }}
                extensions: mbstring
                tools: composer, cs2pr

          - name: Cache MediaWiki
            id: cache-mediawiki
            uses: actions/cache@v3
            with:
                path: |
                    mediawiki
                    mediawiki/extensions/
                    mediawiki/vendor/
                key: mw_${{ matrix.mw }}-php${{ matrix.php }}_v3

          - name: Cache Composer cache
            uses: actions/cache@v3
            with:
                path: ~/.composer/cache
                key: composer_static_analysis

          - uses: actions/checkout@v4
            with:
                path: EarlyCopy

          - name: Install MediaWiki
            if: steps.cache-mediawiki.outputs.cache-hit != 'true'
            working-directory: ~
            run: bash EarlyCopy/.github/workflows/installMediaWiki.sh ${{ matrix.mw }} SPARQL

          - uses: actions/checkout@v4
            with:
                path: mediawiki/extensions/SPARQL

          - name: Composer allow-plugins
            run: composer config --no-plugins allow-plugins.composer/installers true

          - run: composer update

          - name: Composer install
            run: cd extensions/SPARQL && composer install --no-progress --no-interaction --prefer-dist --optimize-autoloader

          - name: Psalm
            run: cd extensions/SPARQL && pwd && php vendor/bin/psalm --config=psalm.xml --shepherd --stats




  code-style:
    name: "Code style: MW ${{ matrix.mw }}, PHP ${{ matrix.php }}"

    strategy:
      matrix:
        include:
          - mw: 'REL1_43'
            php: '8.2'

    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: mediawiki/extensions/SPARQL

    steps:
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: mbstring, intl, php-ast
          tools: composer

      - name: Cache MediaWiki
        id: cache-mediawiki
        uses: actions/cache@v3
        with:
          path: |
            mediawiki
            !mediawiki/extensions/
            !mediawiki/vendor/
          key: mw_static_analysis

      - name: Cache Composer cache
        uses: actions/cache@v3
        with:
          path: ~/.composer/cache
          key: mw_${{ matrix.mw }}-php${{ matrix.php }}_v3

      - name: Install MediaWiki
        if: steps.cache-mediawiki.outputs.cache-hit != 'true'
        working-directory: ~
        run: curl https://gist.githubusercontent.com/JeroenDeDauw/49a3858653ff4b5be7ec849019ede06c/raw/installMediaWiki.sh | bash -s ${{ matrix.mw }} SPARQL

      - uses: actions/checkout@v4
        with:
          path: mediawiki/extensions/SPARQL

      - name: Composer install
        run: composer install --no-progress --no-interaction --prefer-dist --optimize-autoloader

      - run: vendor/bin/phpcs -p -s
