name: Subsystem Benchmarks

on:
  push:
    branches:
      - master
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]
  merge_group:

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

permissions:
  contents: read

jobs:
  preflight:
    uses: ./.github/workflows/reusable-preflight.yml

  build:
    timeout-minutes: 80
    needs: [preflight]
    runs-on: ${{ needs.preflight.outputs.RUNNER }}
    container:
      image: ${{ needs.preflight.outputs.IMAGE }}
    strategy:
      fail-fast: false
      matrix:
        features:
          [
            {
              name: "polkadot-availability-recovery",
              bench: "availability-recovery-regression-bench",
            },
            {
              name: "polkadot-availability-distribution",
              bench: "availability-distribution-regression-bench",
            },
            {
              name: "polkadot-node-core-approval-voting",
              bench: "approval-voting-regression-bench",
            },
            {
              name: "polkadot-statement-distribution",
              bench: "statement-distribution-regression-bench",
            },
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Check Rust
        run: |
          rustup show
          rustup +nightly show

      - name: Run Benchmarks
        id: run-benchmarks
        run: |
          forklift cargo bench -p ${{ matrix.features.name }} --bench ${{ matrix.features.bench }} --features subsystem-benchmarks || echo "Benchmarks failed"
          ls -lsa ./charts

      - name: Upload artifacts
        uses: actions/upload-artifact@v4.3.6
        with:
          name: ${{matrix.features.bench}}
          path: ./charts

  publish-benchmarks:
    timeout-minutes: 60
    needs: [build]
    if: github.ref == 'refs/heads/master'
    environment: subsystem-benchmarks
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: gh-pages
          fetch-depth: 0

      - run: git checkout master --

      - name: Download artifacts
        uses: actions/download-artifact@v4.1.8
        with:
          path: ./charts

      - name: Setup git
        run: |
          # Fixes "detected dubious ownership" error in the ci
          git config --global --add safe.directory '*'
          ls -lsR ./charts

      - uses: actions/create-github-app-token@v1
        id: app-token
        with:
          app-id: ${{ secrets.POLKADOTSDK_GHPAGES_APP_ID }}
          private-key: ${{ secrets.POLKADOTSDK_GHPAGES_APP_KEY }}

      - name: Generate ${{ env.BENCH }}
        env:
          BENCH: availability-recovery-regression-bench
        uses: benchmark-action/github-action-benchmark@v1
        with:
          tool: "customSmallerIsBetter"
          name: ${{ env.BENCH }}
          output-file-path: ./charts/${{ env.BENCH }}/${{ env.BENCH }}.json
          benchmark-data-dir-path: ./bench/${{ env.BENCH }}
          github-token: ${{ steps.app-token.outputs.token }}
          auto-push: true

      - name: Generate ${{ env.BENCH }}
        env:
          BENCH: availability-distribution-regression-bench
        uses: benchmark-action/github-action-benchmark@v1
        with:
          tool: "customSmallerIsBetter"
          name: ${{ env.BENCH }}
          output-file-path: ./charts/${{ env.BENCH }}/${{ env.BENCH }}.json
          benchmark-data-dir-path: ./bench/${{ env.BENCH }}
          github-token: ${{ steps.app-token.outputs.token }}
          auto-push: true

      - name: Generate ${{ env.BENCH }}
        env:
          BENCH: approval-voting-regression-bench
        uses: benchmark-action/github-action-benchmark@v1
        with:
          tool: "customSmallerIsBetter"
          name: ${{ env.BENCH }}
          output-file-path: ./charts/${{ env.BENCH }}/${{ env.BENCH }}.json
          benchmark-data-dir-path: ./bench/${{ env.BENCH }}
          github-token: ${{ steps.app-token.outputs.token }}
          auto-push: true

      - name: Generate ${{ env.BENCH }}
        env:
          BENCH: statement-distribution-regression-bench
        uses: benchmark-action/github-action-benchmark@v1
        with:
          tool: "customSmallerIsBetter"
          name: ${{ env.BENCH }}
          output-file-path: ./charts/${{ env.BENCH }}/${{ env.BENCH }}.json
          benchmark-data-dir-path: ./bench/${{ env.BENCH }}
          github-token: ${{ steps.app-token.outputs.token }}
          auto-push: true