# Docker Compose for building agent-browser
# Usage: docker compose -f docker/docker-compose.yml run build-linux
#        docker compose -f docker/docker-compose.yml run build-windows
#
# Note: macOS builds should be done natively on macOS for compatibility.

services:
  # Build for Linux platforms
  build-linux:
    build:
      context: ..
      dockerfile: docker/Dockerfile.build
    volumes:
      - ../cli:/build
      - ../bin:/output
    command: |
      -c '
        set -e
        echo "Building for Linux platforms (parallel)..."
        
        # Build both targets in parallel
        (echo "→ Linux x64" && cargo zigbuild --release --target x86_64-unknown-linux-gnu && cp /build/target/x86_64-unknown-linux-gnu/release/agent-browser /output/agent-browser-linux-x64 && chmod +x /output/agent-browser-linux-x64 && echo "✓ Linux x64 done") &
        PID1=$$!
        
        (echo "→ Linux ARM64" && cargo zigbuild --release --target aarch64-unknown-linux-gnu && cp /build/target/aarch64-unknown-linux-gnu/release/agent-browser /output/agent-browser-linux-arm64 && chmod +x /output/agent-browser-linux-arm64 && echo "✓ Linux ARM64 done") &
        PID2=$$!
        
        # Wait for both and check exit codes individually — without this
        # the outer script exits 0 even if one of the parallel builds
        # failed, silently leaving a stale binary in /output from the
        # previous release. Caused 0.27.0-fork.5 to ship with a stale
        # linux-x64 binary at the first publish attempt until caught
        # manually by checking the embedded version string.
        wait $$PID1 || { echo "✗ Linux x64 build failed"; exit 1; }
        wait $$PID2 || { echo "✗ Linux ARM64 build failed"; exit 1; }
        
        echo ""
        echo "✓ Linux platforms built successfully!"
        ls -la /output/agent-browser-linux-*
      '

  # Build for Windows
  build-windows:
    build:
      context: ..
      dockerfile: docker/Dockerfile.build
    volumes:
      - ../cli:/build
      - ../bin:/output
    command: |
      -c '
        set -e
        echo "Building for Windows x64..."
        
        cargo build --release --target x86_64-pc-windows-gnu
        cp /build/target/x86_64-pc-windows-gnu/release/agent-browser.exe /output/agent-browser-win32-x64.exe
        
        echo ""
        echo "✓ Windows build completed!"
        ls -la /output/agent-browser-win32-*
      '

  # Build for a single target (override with TARGET env var)
  build-single:
    build:
      context: ..
      dockerfile: docker/Dockerfile.build
    volumes:
      - ../cli:/build
      - ../bin:/output
    environment:
      - TARGET=${TARGET:-x86_64-unknown-linux-gnu}
      - OUTPUT_NAME=${OUTPUT_NAME:-agent-browser-linux-x64}
    # NOTE: $$ escapes a literal $ for the in-container shell. A single $ is
    # interpolated by docker compose at YAML parse time against the *host*
    # environment, which silently drops script-local variables like SRC
    # (caused 0.27.0-fork.7 to ship with a stale linux-arm64 binary because
    # the cp command resolved to `cp "" "/output/"` after compose ate $SRC
    # and $OUTPUT_NAME). $TARGET / $OUTPUT_NAME are set via `environment:`
    # below — those are also passed into the container, so $$TARGET and
    # $$OUTPUT_NAME read them at script time.
    command: |
      -c '
        set -e
        cargo zigbuild --release --target $$TARGET
        SRC="/build/target/$$TARGET/release/agent-browser"
        if [ -f "$$SRC.exe" ]; then SRC="$$SRC.exe"; fi
        cp "$$SRC" "/output/$$OUTPUT_NAME"
        chmod +x /output/$$OUTPUT_NAME 2>/dev/null || true
        echo "✓ Built $$OUTPUT_NAME"
      '
