name: CI

on:
  push:
  pull_request:

env:
  PHPSTAN_PHP_VERSION: "8.5"
  COVERAGE_PHP_VERSION: "8.5"

jobs:
  phpstan:
    name: PHPStan
    runs-on: ubuntu-latest

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

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ env.PHPSTAN_PHP_VERSION }}

      - name: Install composer dependencies
        uses: ramsey/composer-install@v3

      - name: Run PHPStan
        run: vendor/bin/phpstan --no-progress

  coding-standard:
    name: Coding Standard
    uses: brick/coding-standard/.github/workflows/coding-standard.yml@v4
    with:
      php-version: "8.2"
      working-directory: "tools/ecs"

  phpunit:
    name: PHPUnit
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        php-version:
          - "8.2"
          - "8.3"
          - "8.4"
          - "8.5"
        calculator:
          - GMP
          - BCMath
          - Native
        deps:
          - "highest"
        include:
          - php-version: "8.2"
            calculator: GMP
            deps: "lowest"
          - php-version: "8.2"
            calculator: BCMath
            deps: "lowest"
          - php-version: "8.2"
            calculator: Native
            deps: "lowest"

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

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-version }}
          coverage: pcov

      - name: Install composer dependencies
        uses: ramsey/composer-install@v3
        with:
          dependency-versions: ${{ matrix.deps }}

      - name: Run PHPUnit
        run: vendor/bin/phpunit
        env:
          CALCULATOR: ${{ matrix.calculator }}
        if: ${{ matrix.php-version != env.COVERAGE_PHP_VERSION }}

      - name: Run PHPUnit with coverage
        run: vendor/bin/phpunit --coverage-clover clover.xml
        env:
          CALCULATOR: ${{ matrix.calculator }}
        if: ${{ matrix.php-version == env.COVERAGE_PHP_VERSION }}

      - name: Run PHPUnit with bcscale()
        run: vendor/bin/phpunit
        env:
          CALCULATOR: BCMath
          BCMATH_DEFAULT_SCALE: 8
        if: ${{ matrix.calculator == 'BCMath' }}

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
        if: ${{ matrix.php-version == env.COVERAGE_PHP_VERSION }}

  phpunit-32bit:
    name: PHPUnit (32-bit)
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        calculator:
          - GMP
          - BCMath
          - Native

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

      - name: Run PHPUnit with coverage
        run: |
          docker run --platform linux/386 --rm -i \
            -v ${{ github.workspace }}:/app \
            -w /app \
            -e CI=true \
            -e CALCULATOR=${{ matrix.calculator }} \
            php:8.5-cli bash -e <<'EOF'
              apt-get update
              apt-get install -y unzip
              if [ "$CALCULATOR" = "GMP" ]; then apt-get install -y libgmp-dev && docker-php-ext-install gmp > /dev/null; fi
              if [ "$CALCULATOR" = "BCMath" ]; then docker-php-ext-install bcmath > /dev/null; fi
              pecl install pcov > /dev/null
              docker-php-ext-enable pcov
              curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
              composer install --no-interaction
              php -r 'echo "PHP_INT_SIZE=", PHP_INT_SIZE, "\n";'
              php -r 'exit(PHP_INT_SIZE === 4 ? 0 : 1);'
              php -d memory_limit=256M vendor/bin/phpunit --coverage-clover clover.xml
          EOF

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
