# Workflow that builds and tests the CLI binary executable
name: CLI - Build binary and optionally release

# Run on pushes to main branch and CLI tags, and on pull requests when CLI files change
on:
  push:
    branches:
      - main
    tags:
      - "*-cli"
  pull_request:
    paths:
      - "openhands-cli/**"

permissions:
  contents: write       # needed to create releases or upload assets

# Cancel previous runs if a new commit is pushed
concurrency:
  group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }}
  cancel-in-progress: true

jobs:
  build-binary:
    name: Build binary executable
    strategy:
      matrix:
        include:
          # Build on Ubuntu 22.04 for maximum GLIBC compatibility (GLIBC 2.31)
          - os: ubuntu-22.04
            platform: linux
            artifact_name: openhands-cli-linux
          # Build on macOS for macOS users
          - os: macos-15
            platform: macos
            artifact_name: openhands-cli-macos
    runs-on: ${{ matrix.os }}

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

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: 3.12

      - name: Install uv
        uses: astral-sh/setup-uv@v3
        with:
          version: "latest"

      - name: Install dependencies
        working-directory: openhands-cli
        run: |
          uv sync

      - name: Build binary executable
        working-directory: openhands-cli
        run: |
          ./build.sh --install-pyinstaller | tee output.log
          echo "Full output:"
          cat output.log

          if grep -q "❌" output.log; then
            echo "❌ Found failure marker in output"
            exit 1
          fi

          echo "✅ Build & test finished without ❌ markers"

      - name: Verify binary files exist
        run: |
          if ! ls openhands-cli/dist/openhands* 1> /dev/null 2>&1; then
            echo "❌ No binaries found to upload!"
            exit 1
          fi
          echo "✅ Found binaries to upload."

      - name: Upload binary artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.artifact_name }}
          path: openhands-cli/dist/openhands*
          retention-days: 30

  create-github-release:
    name: Create GitHub Release
    runs-on: ubuntu-latest
    needs: build-binary
    if: startsWith(github.ref, 'refs/tags/')
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts

      - name: Prepare release assets
        run: |
          mkdir -p release-assets
          # Copy binaries with appropriate names for release
          if [ -f artifacts/openhands-cli-linux/openhands ]; then
            cp artifacts/openhands-cli-linux/openhands release-assets/openhands-linux
          fi
          if [ -f artifacts/openhands-cli-macos/openhands ]; then
            cp artifacts/openhands-cli-macos/openhands release-assets/openhands-macos
          fi
          ls -la release-assets/

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: release-assets/*
          draft: true
          prerelease: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
