name: "01 - Steampipe: Release"

on:
  workflow_dispatch:
    inputs:
      environment:
        type: choice
        description: "Select Release Type"
        options:
          # to change the values in this option, we also need to update the condition test below in at least 3 location. Search for github.event.inputs.environment
          - Development (alpha)
          - Development (beta)
          - Final (RC and final release)
        required: true
      version:
        description: "Version (without 'v')"
        required: true
        default: 0.2.\invalid
      confirmDevelop:
        description: Confirm running on develop branch
        required: true
        type: boolean

env:
  # Version number from user input, used throughout the workflow for tagging, branching, and release operations
  VERSION: ${{ github.event.inputs.version }}
  # GitHub personal access token for authenticated API operations like creating releases, managing PRs, and repository access
  GH_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}
  # PostgreSQL connection string used in acceptance tests (tests/acceptance/test_files/cloud.bats)
  SPIPETOOLS_PG_CONN_STRING: ${{ secrets.SPIPETOOLS_PG_CONN_STRING }}
  # Authentication token for Steampipe Cloud services used in acceptance tests (tests/acceptance/test_files/cloud.bats and snapshot.bats)
  SPIPETOOLS_TOKEN: ${{ secrets.SPIPETOOLS_TOKEN }}
  # Disable update checks during CI runs to avoid unnecessary network calls and delays
  STEAMPIPE_UPDATE_CHECK: false

jobs:
  ensure_branch_in_homebrew:
    name: Ensure branch exists in homebrew-tap
    runs-on: ubuntu-latest
    steps:
      - name: Calculate version
        id: calculate_version
        run: |
          echo "VERSION=v${{ github.event.inputs.version }}" >> $GITHUB_ENV

      - name: Parse semver string
        id: semver_parser
        uses: booxmedialtd/ws-action-parse-semver@7784200024d6b3fc01253e617ec0168daf603de3 # v1.4.7
        with:
          input_string: ${{ github.event.inputs.version }}

      - name: Checkout
        if: steps.semver_parser.outputs.prerelease == ''
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          repository: turbot/homebrew-tap
          token: ${{ secrets.GH_ACCESS_TOKEN }}
          ref: main

      - name: Delete base branch if exists
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          git fetch --all
          git push origin --delete bump-brew
          git push origin --delete $VERSION
        continue-on-error: true

      - name: Create base branch
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          git checkout -b bump-brew
          git push --set-upstream origin bump-brew

  build_and_release_cli:
    name: Release CLI
    needs: [ensure_branch_in_homebrew]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          path: steampipe
          ref: ${{ github.event.ref }}

      - name: Checkout Pipe Fittings Components repository
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          repository: turbot/pipe-fittings
          path: pipe-fittings
          ref: v1.6.x

      - name: Calculate version
        id: calculate_version
        run: |
          if [ "${{ github.event.inputs.environment }}" = "Development (alpha)" ]; then
            echo "VERSION=v${{ github.event.inputs.version }}-alpha.$(date +'%Y%m%d%H%M')" >> $GITHUB_ENV
          elif [ "${{ github.event.inputs.environment }}" = "Development (beta)" ]; then
            echo "VERSION=v${{ github.event.inputs.version }}-beta.$(date +'%Y%m%d%H%M')" >> $GITHUB_ENV
          else
            echo "VERSION=v${{ github.event.inputs.version }}" >> $GITHUB_ENV
          fi

      - name: Tag Release
        run: |
          cd steampipe
          git config user.name "Steampipe GitHub Actions Bot"
          git config user.email noreply@github.com
          git tag $VERSION
          git push origin $VERSION

      - name: Set up Go
        uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
        with:
          go-version: 1.24

      - name: Install GoReleaser
        uses: goreleaser/goreleaser-action@e435ccd777264be153ace6237001ef4d979d3a7a # v6.4.0
        with:
          install-only: true

      - name: Run GoReleaser
        run: |
          cd steampipe
          goreleaser release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}

  create_pr_in_homebrew:
    name: Create PR in homebrew-tap
    if: ${{ github.event.inputs.environment == 'Final (RC and final release)' }}
    needs: [ensure_branch_in_homebrew, build_and_release_cli]
    runs-on: ubuntu-latest
    env:
      Version: ${{ github.event.inputs.version }}
    steps:
      - name: Calculate version
        id: calculate_version
        run: |
          echo "VERSION=v${{ github.event.inputs.version }}" >> $GITHUB_ENV

      - name: Parse semver string
        id: semver_parser
        uses: booxmedialtd/ws-action-parse-semver@7784200024d6b3fc01253e617ec0168daf603de3 # v1.4.7
        with:
          input_string: ${{ github.event.inputs.version }}

      - name: Checkout
        if: steps.semver_parser.outputs.prerelease == ''
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          repository: turbot/homebrew-tap
          token: ${{ secrets.GH_ACCESS_TOKEN }}
          ref: main

      - name: Create a new branch off the base branch
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          git fetch --all
          git checkout bump-brew
          git checkout -b $VERSION
          git push --set-upstream origin $VERSION

      - name: Close pull request if already exists
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          gh pr close $VERSION
        continue-on-error: true

      - name: Create pull request
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          gh pr create --base main --head $VERSION --title "Steampipe $Version" --body "Update formula"

  update_pr_for_versioning:
    name: Update PR
    if: ${{ github.event.inputs.environment == 'Final (RC and final release)' }}
    needs: [create_pr_in_homebrew]
    runs-on: ubuntu-latest
    env:
      Version: ${{ github.event.inputs.version }}
    steps:
      - name: Calculate version
        id: calculate_version
        run: |
          echo "VERSION=v${{ github.event.inputs.version }}" >> $GITHUB_ENV

      - name: Parse semver string
        id: semver_parser
        uses: booxmedialtd/ws-action-parse-semver@7784200024d6b3fc01253e617ec0168daf603de3 # v1.4.7
        with:
          input_string: ${{ github.event.inputs.version }}

      - name: Checkout
        if: steps.semver_parser.outputs.prerelease == ''
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          repository: turbot/homebrew-tap
          token: ${{ secrets.GH_ACCESS_TOKEN }}
          ref: v${{ github.event.inputs.version }}

      - name: Update live version
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          scripts/formula_versioning.sh
          git config --global user.email "puskar@turbot.com"
          git config --global user.name "Puskar Basu"
          git add .
          git commit -m "Versioning brew formulas"
          git push origin $VERSION

  update_homebrew_tap:
    name: Update homebrew-tap formula
    if: ${{ github.event.inputs.environment == 'Final (RC and final release)' }}
    needs: update_pr_for_versioning
    runs-on: ubuntu-latest
    steps:
      - name: Calculate version
        id: calculate_version
        run: |
          echo "VERSION=v${{ github.event.inputs.version }}" >> $GITHUB_ENV

      - name: Parse semver string
        id: semver_parser
        uses: booxmedialtd/ws-action-parse-semver@7784200024d6b3fc01253e617ec0168daf603de3 # v1.4.7
        with:
          input_string: ${{ github.event.inputs.version }}

      - name: Checkout
        if: steps.semver_parser.outputs.prerelease == ''
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
        with:
          repository: turbot/homebrew-tap
          token: ${{ secrets.GH_ACCESS_TOKEN }}
          ref: main

      - name: Get pull request title
        if: steps.semver_parser.outputs.prerelease == ''
        id: pr_title
        run: >-
          echo "PR_TITLE=$(
            gh pr view $VERSION --json title | jq .title | tr -d '"'
          )" >> $GITHUB_OUTPUT

      - name: Output
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          echo ${{ steps.pr_title.outputs.PR_TITLE }}
          echo ${{ env.VERSION }}

      - name: Fail if PR title does not match with version
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          if [[ "${{ steps.pr_title.outputs.PR_TITLE }}" == "Steampipe ${{ env.VERSION }}" ]]; then
            echo "Correct version"
          else
            echo "Incorrect version"
            exit 1
          fi

      - name: Merge pull request to update brew formula
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          git fetch --all
          gh pr merge $VERSION --squash --delete-branch
          git push origin --delete bump-brew

  trigger_smoke_tests:
    name: Trigger Smoke Tests
    if: ${{ github.event.inputs.environment == 'Final (RC and final release)' }}
    needs: update_homebrew_tap
    runs-on: ubuntu-latest
    steps:
      - name: Calculate version
        id: calculate_version
        run: |
          echo "VERSION=v${{ github.event.inputs.version }}" >> $GITHUB_ENV

      - name: Parse semver string
        id: semver_parser
        uses: booxmedialtd/ws-action-parse-semver@7784200024d6b3fc01253e617ec0168daf603de3 # v1.4.7
        with:
          input_string: ${{ github.event.inputs.version }}

      - name: Trigger smoke test workflow
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          gh workflow run "12-test-post-release-linux-distros.yaml" \
            --ref ${{ github.ref }} \
            --field version=$VERSION \
            --repo ${{ github.repository }}
        env:
          GH_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}

      - name: Get smoke test workflow run URL
        if: steps.semver_parser.outputs.prerelease == ''
        run: |
          echo "Waiting for smoke test workflow to start..."
          sleep 10

          # Get the most recent run of the smoke test workflow
          RUN_ID=$(gh run list \
            --workflow="12-test-post-release-linux-distros.yaml" \
            --repo ${{ github.repository }} \
            --limit 1 \
            --json databaseId \
            --jq '.[0].databaseId')

          if [ -n "$RUN_ID" ]; then
            WORKFLOW_URL="https://github.com/${{ github.repository }}/actions/runs/$RUN_ID"
            echo "✅ Smoke test workflow triggered successfully!"
            echo "🔗 Monitor progress at: $WORKFLOW_URL"
            echo ""
            echo "Workflow details:"
            echo "  - Version: $VERSION"
            echo "  - Workflow: 12-test-post-release-linux-distros.yaml"
            echo "  - Run ID: $RUN_ID"
          else
            echo "⚠️  Could not retrieve workflow run ID. Check manually at:"
            echo "https://github.com/${{ github.repository }}/actions/workflows/12-test-post-release-linux-distros.yaml"
          fi
        env:
          GH_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}
