# https://docs.github.com/en/actions

name: "Integrate"

on:
  pull_request: null
  push:
    branches:
      - "master"

jobs:
  code-coverage:
    name: "Code Coverage"

    runs-on: "ubuntu-latest"

    strategy:
      matrix:
        php-version:
          - "8.4"

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

      - name: "Set up PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          coverage: "xdebug"
          extensions: "none, curl, dom, json, mbstring, tokenizer, xml, xmlwriter, iconv"
          php-version: "${{ matrix.php-version }}"

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

      - name: "Set up problem matchers for phpunit/phpunit"
        run: "echo \"::add-matcher::${{ runner.tool_cache }}/phpunit.json\""

      - name: "Determine composer cache directory"
        run: "echo \"COMPOSER_CACHE_DIR=$(composer config cache-dir)\" >> $GITHUB_ENV"

      - name: "Cache dependencies installed with composer"
        uses: "actions/cache@v6"
        with:
          path: "${{ env.COMPOSER_CACHE_DIR }}"
          key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('composer.lock') }}"
          restore-keys: "php-${{ matrix.php-version }}-composer-"

      - name: "Install dependencies with composer"
        run: "composer install --ansi --no-interaction --no-progress"

      - name: "Collect code coverage from running unit tests with phpunit/phpunit"
        env:
          XDEBUG_MODE: "coverage"
        run: "vendor/bin/phpunit --colors=always --configuration=tests/phpunit.xml --coverage-text --testsuite=unit"

  coding-standards:
    name: "Coding Standards"

    runs-on: "ubuntu-latest"

    strategy:
      matrix:
        php-version:
          - "8.4"

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

      - name: "Set up PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          coverage: "none"
          extensions: "none, curl, dom, json, mbstring, tokenizer, xml, xmlwriter, iconv"
          php-version: "${{ matrix.php-version }}"

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

      - name: "Validate composer.json and composer.lock"
        run: "composer validate --ansi --strict"

      - name: "Determine composer cache directory"
        run: "echo \"COMPOSER_CACHE_DIR=$(composer config cache-dir)\" >> $GITHUB_ENV"

      - name: "Cache dependencies installed with composer"
        uses: "actions/cache@v6"
        with:
          path: "${{ env.COMPOSER_CACHE_DIR }}"
          key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('composer.lock') }}"
          restore-keys: "php-${{ matrix.php-version }}-composer-"

      - name: "Install dependencies with composer"
        run: "composer install --ansi --no-interaction --no-progress"

      - name: "Run friendsofphp/php-cs-fixer"
        run: "vendor/bin/php-cs-fixer check --diff --show-progress=dots --verbose --ansi"

      - name: "Get libxml2-utils"
        run: |
          set -x
          export DEBIAN_FRONTEND=noninteractive
          sudo apt-get update -y | true
          sudo apt-get install -y libxml2-utils

      - name: "Validate XML files"
        run: "for a in $(find . -name '*.xml'); do xmllint --quiet --noout $a; done"

  static-analysis:
    name: "Static Analysis"

    runs-on: "ubuntu-latest"

    strategy:
      matrix:
        php-version:
          - "8.4"

        dependencies:
          - "locked"

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

      - name: "Set up PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          coverage: "none"
          extensions: "none, curl, dom, json, mbstring, tokenizer, xml, xmlwriter, iconv"
          php-version: "${{ matrix.php-version }}"

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

      - name: "Determine composer cache directory"
        run: "echo \"COMPOSER_CACHE_DIR=$(composer config cache-dir)\" >> $GITHUB_ENV"

      - name: "Cache dependencies installed with composer"
        uses: "actions/cache@v6"
        with:
          path: "${{ env.COMPOSER_CACHE_DIR }}"
          key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('composer.lock') }}"
          restore-keys: "php-${{ matrix.php-version }}-composer-"

      - name: "Install dependencies with composer"
        run: "composer install --ansi --no-interaction --no-progress"

      - name: "Run static analysis"
        run: "vendor/bin/phpstan"

  tests:
    name: "Tests"

    runs-on: "ubuntu-latest"

    strategy:
      matrix:
        php-version:
          - "8.4"

    env:
      HTTP_HOST: "localhost:8080"

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

      - name: "Set up PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          coverage: "none"
          extensions: "none, curl, dom, json, mbstring, tokenizer, xml, xmlwriter, iconv"
          php-version: "${{ matrix.php-version }}"

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

      - name: "Set up problem matchers for phpunit/phpunit"
        run: "echo \"::add-matcher::${{ runner.tool_cache }}/phpunit.json\""

      - name: "Determine composer cache directory"
        run: "echo \"COMPOSER_CACHE_DIR=$(composer config cache-dir)\" >> $GITHUB_ENV"

      - name: "Cache dependencies installed with composer"
        uses: "actions/cache@v6"
        with:
          path: "${{ env.COMPOSER_CACHE_DIR }}"
          key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('composer.lock') }}"
          restore-keys: "php-${{ matrix.php-version }}-composer-"

      - name: "Install dependencies with composer"
        run: "composer install --ansi --no-interaction --no-progress"

      - name: "Run unit tests with phpunit/phpunit"
        run: "vendor/bin/phpunit --colors=always --configuration=tests/phpunit.xml --testsuite=unit"

      - name: "Start built-in web server for PHP"
        run: "php -S ${{ env.HTTP_HOST }} .router.php &"

      - name: "Run end-to-end tests with phpunit/phpunit"
        run: "vendor/bin/phpunit --colors=always --configuration=tests/phpunit.xml --testsuite=end-to-end"
