name: 🤖 PR Checks

on:
  pull_request:
    types: [opened, synchronize, reopened]

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

permissions:
  contents: read
  pull-requests: read

jobs:
  changes:
    name: Detect changes
    runs-on: warp-ubuntu-latest-x64-2x
    outputs:
      code: ${{ steps.code_filter.outputs.code }}
      typecheck_self: ${{ steps.filter.outputs.typecheck_self }}
      webapp: ${{ steps.filter.outputs.webapp }}
      packages: ${{ steps.filter.outputs.packages }}
      internal: ${{ steps.filter.outputs.internal }}
      cli: ${{ steps.filter.outputs.cli }}
      sdk: ${{ steps.filter.outputs.sdk }}
    steps:
      # `code` uses `every` semantics so the negation patterns actually subtract.
      # With the default `some` quantifier, `**` matches every file and the
      # subsequent `!...` patterns are no-ops (each pattern is OR'd, not AND'd).
      - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
        id: code_filter
        with:
          predicate-quantifier: every
          filters: |
            code:
              - '**'
              - '!docs/**'
              - '!.changeset/**'
              - '!hosting/**'
              - '!.github/**'
              - '!**/*.md'
              - '!**/.env.example'
      - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
        id: filter
        with:
          filters: |
            typecheck_self:
              - '.github/workflows/pr_checks.yml'
              - '.github/workflows/typecheck.yml'
              - '.github/workflows/code-quality.yml'
            webapp:
              - 'apps/webapp/**'
              - 'packages/**'
              - 'internal-packages/**'
              - '.github/workflows/pr_checks.yml'
              - '.github/workflows/unit-tests-webapp.yml'
              - '.github/workflows/e2e-webapp.yml'
              - '.configs/**'
              - 'package.json'
              - 'pnpm-lock.yaml'
              - 'pnpm-workspace.yaml'
              - 'turbo.json'
            packages:
              - 'packages/**'
              - '.github/workflows/pr_checks.yml'
              - '.github/workflows/unit-tests-packages.yml'
              - '.configs/**'
              - 'package.json'
              - 'pnpm-lock.yaml'
              - 'pnpm-workspace.yaml'
              - 'turbo.json'
            internal:
              - 'internal-packages/**'
              - 'packages/**'
              - '.github/workflows/pr_checks.yml'
              - '.github/workflows/unit-tests-internal.yml'
              - '.configs/**'
              - 'package.json'
              - 'pnpm-lock.yaml'
              - 'pnpm-workspace.yaml'
              - 'turbo.json'
            cli:
              - 'packages/cli-v3/**'
              - 'packages/build/**'
              - 'packages/core/**'
              - 'packages/schema-to-json/**'
              - '.github/workflows/pr_checks.yml'
              - '.github/workflows/e2e.yml'
              - '.configs/**'
              - 'package.json'
              - 'pnpm-lock.yaml'
              - 'pnpm-workspace.yaml'
              - 'turbo.json'
            sdk:
              - 'packages/trigger-sdk/**'
              - 'packages/core/**'
              - '.github/workflows/pr_checks.yml'
              - '.github/workflows/sdk-compat.yml'
              - '.configs/**'
              - 'package.json'
              - 'pnpm-lock.yaml'
              - 'pnpm-workspace.yaml'
              - 'turbo.json'

  code-quality:
    uses: ./.github/workflows/code-quality.yml

  typecheck:
    needs: changes
    if: needs.changes.outputs.code == 'true' || needs.changes.outputs.typecheck_self == 'true'
    uses: ./.github/workflows/typecheck.yml

  webapp:
    needs: changes
    if: needs.changes.outputs.webapp == 'true'
    uses: ./.github/workflows/unit-tests-webapp.yml
    secrets:
      DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
      DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}

  e2e-webapp:
    needs: changes
    if: needs.changes.outputs.webapp == 'true'
    uses: ./.github/workflows/e2e-webapp.yml
    secrets:
      DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
      DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}

  packages:
    needs: changes
    if: needs.changes.outputs.packages == 'true'
    uses: ./.github/workflows/unit-tests-packages.yml
    secrets:
      DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
      DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}

  internal:
    needs: changes
    if: needs.changes.outputs.internal == 'true'
    uses: ./.github/workflows/unit-tests-internal.yml
    secrets:
      DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
      DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}

  e2e:
    needs: changes
    if: needs.changes.outputs.cli == 'true'
    uses: ./.github/workflows/e2e.yml
    with:
      package: cli-v3

  sdk-compat:
    needs: changes
    if: needs.changes.outputs.sdk == 'true'
    uses: ./.github/workflows/sdk-compat.yml

  all-checks:
    name: All PR Checks
    needs:
      - changes
      - code-quality
      - typecheck
      - webapp
      - e2e-webapp
      - packages
      - internal
      - e2e
      - sdk-compat
    if: always()
    runs-on: warp-ubuntu-latest-x64-2x
    steps:
      - name: Verify all checks
        run: |
          if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
            echo "One or more checks failed"
            exit 1
          fi
          if [[ "${{ contains(needs.*.result, 'cancelled') }}" == "true" ]]; then
            echo "One or more checks were cancelled"
            exit 1
          fi
          echo "All checks passed or were skipped due to path filters"
