name: CI

on:
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch: {}
  push:
    branches:
      - master
      - beta
      - sdk-release/**
      - feature/**
    tags:
      - v[0-9]+.[0-9]+.[0-9]+*
  pull_request:
    branches:
      - master
      - beta
      - private-preview
      - sdk-release/**
      - feature/**

permissions: {}

jobs:
  php-cs-fixer:
    name: PHP-CS-Fixer

    runs-on: "ubuntu-24.04"

    permissions:
      contents: read

    steps:
      - uses: extractions/setup-just@v2
      - uses: actions/checkout@v3

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: "8.2"

      - name: Get Composer Cache Directory
        id: composer-cache
        run: |
          echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

      - uses: actions/cache@v3
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          # Conventionally you would hash "composer.lock", but we don't commit
          # that, so we hash on "composer.json" instead.
          key: ${{ runner.os }}-composer-${{ hashFiles('composer.json') }}

      - name: Validate composer.json
        run: composer validate

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress

      - name: Run PHP-CS-Fixer
        run: just format-check

  phpstan:
    name: PHPStan

    runs-on: "ubuntu-24.04"

    permissions:
      contents: read

    steps:
      - uses: extractions/setup-just@v2
      - uses: actions/checkout@v3

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: "8.2"

      - name: Get Composer Cache Directory
        id: composer-cache
        run: |
          echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT

      - uses: actions/cache@v3
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          # Conventionally you would hash "composer.lock", but we don't commit
          # that, so we hash on "composer.json" instead.
          key: ${{ runner.os }}-composer-${{ hashFiles('composer.json') }}

      - name: Validate composer.json
        run: composer validate

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress

      - name: Run phpstan
        run: just lint

  tests:
    runs-on: "ubuntu-24.04"

    permissions:
      contents: read

    strategy:
      fail-fast: false
      matrix:
        autoload:
          - "0"
          - "1"
        php-version:
          - "5.6"
          - "7.0"
          - "7.1"
          - "7.2"
          - "7.3"
          - "7.4"
          - "8.0"
          - "8.1"
          - "8.2"
          - "8.3"
          - "8.4"
    name: Tests (php@${{ matrix.php-version }}, AUTOLOAD=${{ matrix.autoload }})

    steps:
      - uses: extractions/setup-just@v2
      - uses: actions/checkout@v3

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

      - name: Get Composer Cache Directory
        id: composer-cache
        run: |
          echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
      - uses: actions/cache@v3
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('composer.json') }}

      # We run php-cs-fixer and PHPStan in separate jobs, but the versions we use are not compatible
      # with all the versions of PHP that we want to execute PHPUnit upon
      - name: Trim dependency
        run: composer remove --dev --no-update friendsofphp/php-cs-fixer phpstan/phpstan

      - name: Validate composer.json
        run: composer validate

      - name: Install dependencies
        run: composer install --prefer-dist --no-progress

      - uses: stripe/openapi/actions/stripe-mock@master

      - name: Run test suite
        # --yes skips the confirmation dialogue for the CI test, which modifies files
        run: |
          php --version
          just --yes ci-test ${{ matrix.autoload }}

  publish:
    # Doesn't actually publish. The publish happens via a packagist webhook configured in the Github UI. But we still display a message here
    name: Publish
    if: >-
      (github.event_name == 'workflow_dispatch' || github.event_name == 'push') &&
      startsWith(github.ref, 'refs/tags/v') &&
      endsWith(github.actor, '-stripe')
    runs-on: "ubuntu-24.04"
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v2
      - uses: stripe/openapi/actions/notify-release@master
        if: always()
        with:
          bot_token: ${{ secrets.SLACK_BOT_TOKEN }}
