name: Publish VS Code Extension

on:
  workflow_dispatch:
    inputs:
      version:
        description: Extension version to publish, for example 0.1.0. Leave empty to use package.json or the pushed tag.
        required: false
        type: string
      publish_to_marketplace:
        description: Publish to the Visual Studio Marketplace after packaging.
        required: true
        type: boolean
        default: true
  push:
    tags:
      - 'gframework-config-tool-v*'

permissions:
  contents: read

jobs:
  publish:
    name: Package And Publish Marketplace Extension
    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: tools/gframework-config-tool

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Setup Node.js 20
        uses: actions/setup-node@v6
        with:
          node-version: 20

      - name: Setup Bun
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: 1.2.15

      - name: Determine extension version
        id: version
        shell: bash
        run: |
          set -euo pipefail

          PACKAGE_VERSION=$(node -p "require('./package.json').version")
          VERSION="${PACKAGE_VERSION}"

          if [[ "${GITHUB_REF:-}" == refs/tags/gframework-config-tool-v* ]]; then
            VERSION="${GITHUB_REF#refs/tags/gframework-config-tool-v}"
          elif [[ -n "${{ inputs.version || '' }}" ]]; then
            VERSION="${{ inputs.version }}"
          fi

          echo "Resolved extension version: ${VERSION}"
          echo "version=${VERSION}" >> "${GITHUB_OUTPUT}"

      - name: Install extension dependencies
        run: bun install

      - name: Synchronize package.json version
        shell: bash
        run: |
          set -euo pipefail
          node -e "const fs=require('fs'); const path='package.json'; const data=JSON.parse(fs.readFileSync(path,'utf8')); data.version='${{ steps.version.outputs.version }}'; fs.writeFileSync(path, JSON.stringify(data, null, 2) + '\n');"

      - name: Run extension tests
        run: bun run test

      - name: Package VSIX
        run: |
          set -euo pipefail
          mkdir -p ../../artifacts
          bun run package:vsix -- --out "../../artifacts/gframework-config-tool-${{ steps.version.outputs.version }}.vsix"

      - name: Upload VSIX artifact
        uses: actions/upload-artifact@v7
        with:
          name: gframework-config-tool-vsix
          path: artifacts/gframework-config-tool-${{ steps.version.outputs.version }}.vsix
          if-no-files-found: error

      - name: Publish to Visual Studio Marketplace
        if: github.event_name == 'push' || inputs.publish_to_marketplace
        env:
          VSCE_PAT: ${{ secrets.VSCE_PAT }}
        run: bun run publish:marketplace
