name: Benchmarks

on:
  workflow_dispatch:
  schedule:
    - cron: '0 3 * * 1'
  push:
    branches:
      - main
    paths:
      - 'src/main/**'
      - 'src/jmh/**'
      - 'models/**'
      - 'build-logic/**'
      - 'build.gradle'
      - 'gradle.properties'
      - 'gradle.lockfile'
      - 'settings.gradle'
      - 'gradle/**'
      - 'gradlew'
      - 'gradlew.bat'
      - '.github/workflows/benchmarks.yml'

concurrency:
  group: benchmarks-${{ github.ref }}
  cancel-in-progress: true

jobs:
  jmh:
    runs-on: ubuntu-latest
    timeout-minutes: 30

    permissions:
      contents: read

    steps:
      - name: Check out sources
        uses: actions/checkout@v4

      - name: Validate Gradle wrapper
        uses: gradle/actions/wrapper-validation@v4

      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '21'

      - name: Set up Gradle caching and instrumentation
        uses: gradle/actions/setup-gradle@v4

      - name: Verify reproducibility inputs
        shell: bash
        run: |
          set -euo pipefail
          test -f gradle.lockfile
          test -f gradle.properties
          test -f gradle/verification-metadata.xml

      - name: Run JMH benchmarks
        run: ./gradlew clean jmh -Pjmh.includes='.*EnglishStemmerComparisonBenchmark.*' --no-daemon

      - name: Upload JMH reports
        uses: actions/upload-artifact@v4
        with:
          name: jmh-reports
          path: |
            build/reports/jmh/**
            build/results/jmh/**
          if-no-files-found: warn
