name: Docker Build Time Benchmark

on:
  push:
    branches:
      - main
    paths:
      - "Dockerfile"
      - ".dockerignore"
  pull_request:
    paths:
      - "Dockerfile"
      - ".dockerignore"

jobs:
  benchmark:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      # For PRs, checkout the base branch to compare against
      - name: Checkout base branch
        if: github.base_ref
        uses: actions/checkout@v6
        with:
          ref: ${{ github.base_ref }}
          clean: true
          fetch-depth: 0

      - name: Clean Docker system
        run: |
          docker system prune -af
          docker builder prune -af

      - name: Build base branch image
        if: github.base_ref
        id: base_build_time
        run: |
          start_time=$(date +%s)
          docker buildx build \
            --platform linux/amd64,linux/arm64 \
            --no-cache \
            --progress=plain \
            --build-arg NODE_VERSION=20.19.0 \
            .
          end_time=$(date +%s)
          base_time=$((end_time - start_time))
          echo "base_time=$base_time" >> $GITHUB_OUTPUT

      # For PRs, checkout back to the PR's HEAD
      - name: Checkout PR branch
        if: github.base_ref
        uses: actions/checkout@v6
        with:
          ref: ${{ github.head_ref }}
          clean: true
          fetch-depth: 0

      - name: Clean Docker system again
        run: |
          docker system prune -af
          docker builder prune -af

      - name: Build and time Docker image
        id: build_time
        run: |
          start_time=$(date +%s)
          docker buildx build \
            --platform linux/amd64,linux/arm64 \
            --no-cache \
            --progress=plain \
            .
          end_time=$(date +%s)
          build_time=$((end_time - start_time))
          echo "build_time=$build_time" >> $GITHUB_OUTPUT

      - name: Compare build times
        run: |
          CURRENT_TIME=${{ steps.build_time.outputs.build_time }}

          if [ "${{ github.base_ref }}" != "" ]; then
            BASE_TIME=${{ steps.base_build_time.outputs.base_time }}

            echo "### 🏗️ Docker Build Time Comparison" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "| Branch | Build Time | Difference |" >> $GITHUB_STEP_SUMMARY
            echo "|--------|------------|------------|" >> $GITHUB_STEP_SUMMARY
            echo "| base (${{ github.base_ref }}) | ${BASE_TIME}s | - |" >> $GITHUB_STEP_SUMMARY

            DIFF=$((CURRENT_TIME - BASE_TIME))
            PERCENT=$(echo "scale=2; ($CURRENT_TIME - $BASE_TIME) * 100 / $BASE_TIME" | bc)

            if [ $DIFF -gt 0 ]; then
              DIFF_TEXT="⬆️ +${DIFF}s (+${PERCENT}%)"
            elif [ $DIFF -lt 0 ]; then
              DIFF_TEXT="⬇️ ${DIFF}s (${PERCENT}%)"
            else
              DIFF_TEXT="✨ No change"
            fi

            echo "| current (${{ github.head_ref }}) | ${CURRENT_TIME}s | $DIFF_TEXT |" >> $GITHUB_STEP_SUMMARY

            # Fail if build time increased by more than 5%
            if (( $(echo "$PERCENT > 5" | bc -l) )); then
              echo "" >> $GITHUB_STEP_SUMMARY
              echo "❌ **Build time increased by more than 5%!**" >> $GITHUB_STEP_SUMMARY
              echo "This change significantly increases the build time. Please review the Dockerfile changes." >> $GITHUB_STEP_SUMMARY
              exit 1
            elif (( $(echo "$PERCENT < 0" | bc -l) )); then
              echo "" >> $GITHUB_STEP_SUMMARY
              echo "✅ **Build time decreased!**" >> $GITHUB_STEP_SUMMARY
              echo "Great job optimizing the build!" >> $GITHUB_STEP_SUMMARY
            fi
          else
            echo "### 🏗️ Docker Build Time" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "Build completed in ${CURRENT_TIME} seconds" >> $GITHUB_STEP_SUMMARY
          fi
