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

name: "Continuous Integration"

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@v6"

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

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v4"
        with:
          dependency-versions: "highest"

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

      - name: "Check coding standards (PHP_CodeSniffer)"
        run: "composer dev:lint:style"

  static-analysis:
    name: "Static analysis"
    runs-on: "ubuntu-latest"

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

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

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v4"
        with:
          dependency-versions: "highest"

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

  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"
          - "8.4"
          - "8.5"

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

      - 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@v4"
        with:
          dependency-versions: "highest"

      - name: "Run benchmarks (PHPBench)"
        run: "composer dev:bench"

  code-coverage:
    name: "Code coverage"
    needs: ["coding-standards", "static-analysis"]
    runs-on: "ubuntu-latest"

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

      - 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: "xdebug"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v4"
        with:
          dependency-versions: "highest"

      - name: "Run unit tests (PHPUnit)"
        run: "composer dev:test:coverage:ci"

      - name: "Publish coverage report to Codecov"
        uses: "codecov/codecov-action@v6"

      - name: "Upload test results to Codecov"
        if: ${{ !cancelled() }}
        uses: "codecov/test-results-action@v1"
        with:
          disable_search: true
          file: "./build/junit.xml"

  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"
          - "8.4"
          - "8.5"
        operating-system:
          - "ubuntu-latest"
          - "windows-latest"
        dependency-versions:
          - "locked"
          - "highest"

    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@v6"

      - 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: "Downgrade brick/math in lock file for PHP 8.0"
        run: |
          composer update brick/math:"0.8.16"

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

      - name: "Run unit tests (PHPUnit)"
        run: "composer dev:test:unit"
