name: Promote next to release

on:
  workflow_dispatch:
    inputs:
      source_only:
        description: "Create/refresh tagged release only (skip platform builds and verify-nix)"
        required: false
        default: false
        type: boolean

jobs:
  promote:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      actions: write
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0
          ref: release
      - name: setup node
        uses: actions/setup-node@v5
        with:
          node-version: lts/*
      - name: fast-forward release to next
        run: |
          set -euo pipefail
          git fetch origin next release
          # Reset stable channel to next snapshot, then finalize version on top.
          git reset --hard origin/next
      - name: finalize package version for release
        run: |
          set -euo pipefail
          CURRENT_VERSION="$(node -p 'require("./package.json").version')"
          FINAL_VERSION="$(node -p 'const v=require("./package.json").version; const m=v.match(/^(\d+\.\d+\.\d+)/); if(!m){throw new Error("Invalid version: "+v)}; m[1]')"
          if [[ "$CURRENT_VERSION" == "$FINAL_VERSION" ]]; then
            echo "package.json is already final: $FINAL_VERSION"
            exit 0
          fi
          npm version --no-git-tag-version "$FINAL_VERSION"
      - name: sync Tauri version from package.json
        run: node scripts/sync-tauri-version-from-package.js
      - name: commit final version bump
        run: |
          set -euo pipefail
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git add package.json package-lock.json src-tauri/Cargo.toml src-tauri/Cargo.lock src-tauri/tauri.conf.json
          if git diff --cached --quiet; then
            echo "No finalization changes to commit."
            exit 0
          fi
          NEW_VERSION="$(node -p 'require("./package.json").version')"
          MSG="chore(release): finalize release version ${NEW_VERSION}"
          if [[ "${{ inputs.source_only }}" == "true" ]]; then
            MSG="${MSG} [source-only]"
          fi
          git commit -m "$MSG"
      - name: push release
        run: git push --force-with-lease origin HEAD:release
      - name: dispatch Release Channel workflow
        uses: actions/github-script@v9
        env:
          SOURCE_ONLY: ${{ inputs.source_only && 'true' || 'false' }}
        with:
          script: |
            const sourceOnly = process.env.SOURCE_ONLY === "true";
            await github.rest.actions.createWorkflowDispatch({
              owner: context.repo.owner,
              repo: context.repo.repo,
              workflow_id: "release.yml",
              ref: "main",
              inputs: {
                source_only: sourceOnly ? "true" : "false",
              },
            });
            core.info(`Dispatched release.yml with source_only=${sourceOnly}`);
