# GitHub Actions Documentation: https://docs.github.com/en/actions

name: "build"

on:
  push:
    branches:
      - "*.x"
    tags:
      - "*"
  pull_request:
    branches:
      - "*.x"

# Cancels all previous workflow runs for the same branch that have not yet completed.
concurrency:
  # The concurrency group contains the workflow name and the branch name.
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  COMPOSER_ROOT_VERSION: "1.99.99"

jobs:
  coding-standards:
    name: "Coding standards"
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v4"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "latest"
          coverage: "none"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v2"

      - name: "Check syntax (php-parallel-lint)"
        run: "composer lint -- --colors"

      - name: "Check coding standards (PHP_CodeSniffer)"
        run: "./vendor/bin/phpcs --colors"

  static-analysis:
    name: "Static analysis"
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v4"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "latest"
          coverage: "none"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v2"

      - name: "Statically analyze code (PHPStan)"
        run: "composer phpstan -- --ansi"

      - name: "Statically analyze code (Psalm)"
        run: "composer psalm -- --shepherd"

  benchmark:
    name: "Benchmark"
    needs: ["coding-standards", "static-analysis"]
    runs-on: "ubuntu-latest"

    strategy:
      fail-fast: false
      matrix:
        php-version:
          - "8.0"
          - "8.1"
          - "8.2"
          - "8.3"

    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v4"

      - name: "Install dependencies (apt)"
        run: |
          sudo apt-get update
          sudo apt-get -y install libsodium-dev uuid-dev

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-version }}"
          extensions: bcmath, gmp, sodium, uuid
          coverage: "none"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v2"

      - name: "Run PHPBench"
        run: "composer phpbench -- --ansi"

  code-coverage:
    name: "Code coverage"
    needs: ["coding-standards", "static-analysis"]
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v4"

      - name: "Install dependencies (apt)"
        run: |
          sudo apt-get update
          sudo apt-get -y install libsodium-dev uuid-dev

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "latest"
          extensions: bcmath, gmp, sodium, uuid
          coverage: "pcov"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v2"
        with:
          dependency-versions: "${{ matrix.dependencies }}"

      - name: "Run unit tests (PHPUnit)"
        run: "./vendor/bin/phpunit --verbose --colors=always --coverage-text --coverage-clover build/logs/clover.xml"

      - name: "Publish coverage report to Codecov"
        uses: "codecov/codecov-action@v3.1.4"

  unit-tests:
    name: "Unit Tests"
    needs: ["code-coverage"]
    runs-on: ${{ matrix.operating-system }}

    strategy:
      fail-fast: false
      matrix:
        php-version:
          - "8.0"
          - "8.1"
          - "8.2"
          - "8.3"
        operating-system:
          - "ubuntu-latest"
          - "windows-latest"

    steps:
      - name: "Configure Git (for Windows)"
        if: ${{ matrix.operating-system == 'windows-latest' }}
        run: |
          git config --system core.autocrlf false
          git config --system core.eol lf

      - name: "Checkout repository"
        uses: "actions/checkout@v4"

      - name: "Install dependencies (apt)"
        if: ${{ matrix.operating-system == 'ubuntu-latest' }}
        run: |
          sudo apt-get update
          sudo apt-get -y install libsodium-dev uuid-dev

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-version }}"
          extensions: bcmath, gmp, sodium, uuid
          coverage: "none"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v2"
        with:
          composer-options: "${{ matrix.composer-options }}"

      - name: "Run unit tests (PHPUnit)"
        run: "./vendor/bin/phpunit --verbose --colors=always --no-coverage"
