# This is a copy of queue-main.yml, but with a different branch pattern.
# It does not push the result anywhere; it logs instead.
# It is meant for people changing how the commit queue works:
# You can hack on the workflows, push to queue-dev-$USER, and iterate.
# Please keep this file in sync with queue-main.yml.

name: Dev Commit Queue
on:
  push:
    branches:
      - "queue-dev-*"

permissions: read-all

jobs:
  formatting:
    uses: ./.github/workflows/formatting.yml
    permissions:
      contents: write
    with:
      auto_fix: true

  go-test:
    needs: [formatting]
    uses: ./.github/workflows/go_test.yml
    permissions: read-all
    with:
      ref: ${{ needs.formatting.outputs.commit_sha }}

  ui-test:
    needs: [formatting]
    uses: ./.github/workflows/webui_test.yml
    permissions: read-all
    with:
      ref: ${{ needs.formatting.outputs.commit_sha }}

  push-to-main:
    runs-on: ubuntu-latest
    needs: [go-test, ui-test, formatting]
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Push to main
        id: push
        run: |
          COMMIT_TO_PUSH="HEAD"
          if [[ "${{ needs.formatting.outputs.commit_sha }}" != "" ]]; then
            echo "Using formatted commit: ${{ needs.formatting.outputs.commit_sha }}"
            COMMIT_TO_PUSH="${{ needs.formatting.outputs.commit_sha }}"
          fi

          # Get the actual commit SHA that we're pushing
          COMMIT_SHA=$(git rev-parse "${COMMIT_TO_PUSH}")
          echo "commit_sha=${COMMIT_SHA}" >> $GITHUB_OUTPUT

          # Get the list of commits that would be pushed (in chronological order)
          COMMITS_TO_NOTIFY=$(git log origin/main.."${COMMIT_TO_PUSH}" --reverse --format="%H" | tr '\n' ' ')
          echo "commits_to_notify=${COMMITS_TO_NOTIFY}" >> $GITHUB_OUTPUT
          echo "Commits that would be pushed and notified: ${COMMITS_TO_NOTIFY}"

          echo "Would push to main: ${COMMIT_TO_PUSH}"
        env:
          GITHUB_TOKEN: ${{ github.token }}

      - name: Send Discord notifications for all commits that would be pushed
        if: success()
        env:
          DISCORD_WEBHOOK_FOR_COMMITS: ${{ secrets.DISCORD_WEBHOOK_FOR_COMMITS }}
        run: |
          COMMITS="${{ steps.push.outputs.commits_to_notify }}"
          if [[ -z "$COMMITS" ]]; then
            echo "No commits to notify about"
            exit 0
          fi
          
          echo "Sending Discord notifications for commits that would be pushed: $COMMITS"
          for commit_sha in $COMMITS; do
            echo "Sending notification for commit: $commit_sha"
            git checkout "$commit_sha"
            GITHUB_SHA="$commit_sha" python3 .github/scripts/discord_notify.py
          done
