name: Publish Go SDK

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - 'apps/go-sdk/**'
      - '.github/workflows/publish-go-sdk.yml'

# Go modules are "published" by pushing a git tag. For modules living in a
# monorepo subdirectory, the tag MUST be prefixed with the subdir path —
# e.g. apps/go-sdk/v1.0.0 — for the Go module proxy to resolve it.
#
# This workflow reads Version from apps/go-sdk/version.go, checks whether the
# corresponding tag already exists, and if not creates+pushes it, then warms
# the proxy.golang.org cache to trigger pkg.go.dev indexing.
jobs:
  publish:
    name: Tag and index on pkg.go.dev
    runs-on: blacksmith-2vcpu-ubuntu-2404
    permissions:
      contents: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: "1.23"
          cache-dependency-path: apps/go-sdk/go.sum

      - name: Build and vet
        working-directory: ./apps/go-sdk
        run: |
          go build ./...
          go vet ./...

      - name: Read SDK version
        id: version
        working-directory: ./apps/go-sdk
        run: |
          VERSION=$(grep -E '^const Version = ' version.go | sed -E 's/.*"([^"]+)".*/\1/')
          if [ -z "$VERSION" ]; then
            echo "Failed to parse Version from apps/go-sdk/version.go" >&2
            exit 1
          fi
          TAG="apps/go-sdk/v${VERSION}"
          echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
          echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
          echo "Resolved version: ${VERSION} (tag: ${TAG})"

      - name: Check if tag already exists
        id: tag_check
        run: |
          TAG="${{ steps.version.outputs.tag }}"
          if git rev-parse -q --verify "refs/tags/${TAG}" >/dev/null; then
            echo "exists=true" >> "$GITHUB_OUTPUT"
            echo "Tag ${TAG} already exists — skipping publish."
          else
            echo "exists=false" >> "$GITHUB_OUTPUT"
          fi

      - name: Create and push tag
        if: steps.tag_check.outputs.exists == 'false'
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          TAG="${{ steps.version.outputs.tag }}"
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git tag -a "${TAG}" -m "Release Go SDK ${TAG}"
          git push origin "${TAG}"

      - name: Warm Go module proxy (triggers pkg.go.dev indexing)
        if: steps.tag_check.outputs.exists == 'false'
        run: |
          MODULE="github.com/firecrawl/firecrawl/apps/go-sdk"
          VERSION="v${{ steps.version.outputs.version }}"
          # Force a module-proxy fetch; pkg.go.dev discovers modules from proxy.golang.org.
          # Retry a few times because the tag may take a moment to be visible to the proxy.
          for i in 1 2 3 4 5; do
            if curl -fsSL "https://proxy.golang.org/${MODULE}/@v/${VERSION}.info" -o /dev/null; then
              echo "Module ${MODULE}@${VERSION} fetched from proxy.golang.org"
              exit 0
            fi
            echo "Attempt $i: proxy not yet aware of ${VERSION}; sleeping 30s"
            sleep 30
          done
          echo "::warning::proxy.golang.org did not resolve ${MODULE}@${VERSION} yet; pkg.go.dev will pick it up on the next fetch."
