name: Rust release artifacts

# Triggered on tag push (v*) — builds release binaries across desktop targets
# and assembles a GitHub Release draft. The `build` job builds the real
# `op-host-desktop` crate (winit + skia-safe runner that drives the Rust
# editor); its shipped executable keeps the stable `openpencil-desktop`
# name. Full DMG / AppImage / EXE installer packaging lands in Step 1f.
# The wasm web bundle is currently DEFERRED (see comment block below); when
# the CI-side C-hard pipeline (emscripten install + EMSDK + symlink hack +
# wasm-bindgen + wasm-opt) lands it will re-enter the matrix.

on:
  push:
    tags: ['v*']
  workflow_dispatch:

jobs:
  build:
    name: ${{ matrix.label }}
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - label: macos-aarch64
            runner: macos-latest
            target: aarch64-apple-darwin
            archive: tar.gz
          # macos-13 (Intel) deprecated; cross-compile x86_64-apple-darwin
          # from Apple Silicon (cargo supports cross-compile to host's other
          # arch out of the box, no `cross` needed).
          - label: macos-x86_64
            runner: macos-latest
            target: x86_64-apple-darwin
            archive: tar.gz
          - label: linux-x86_64
            runner: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            archive: tar.gz
          # Native ARM64 hosted runner — no `cross`. The cross 0.2.x aarch64
          # image (Ubuntu 16.04 / GCC 5 / FreeType 2.6) is too old to link the
          # modern skia that skia-bindings builds.
          - label: linux-aarch64
            runner: ubuntu-24.04-arm
            target: aarch64-unknown-linux-gnu
            archive: tar.gz
          - label: windows-x86_64
            runner: windows-latest
            target: x86_64-pc-windows-msvc
            archive: zip
          # Windows ARM64 — cargo cross-compile from x86_64 windows runner.
          - label: windows-aarch64
            runner: windows-latest
            target: aarch64-pc-windows-msvc
            archive: zip
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: '1.94'
          targets: ${{ matrix.target }}
      - uses: Swatinem/rust-cache@v2
        with:
          key: release-${{ matrix.target }}
      - name: Install Linux GL/EGL prereqs
        if: runner.os == 'Linux'
        run: |
          sudo apt-get update
          sudo apt-get install -y \
            libxkbcommon-dev libxkbcommon-x11-dev \
            libwayland-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \
            libegl1-mesa-dev libgles2-mesa-dev libgbm-dev \
            libfreetype-dev libfontconfig1-dev
      - name: Build (host)
        run: cargo build -p op-host-desktop --target ${{ matrix.target }} --release
      - name: Package archive (unix)
        if: matrix.archive == 'tar.gz'
        shell: bash
        run: |
          cd target/${{ matrix.target }}/release
          tar czf ../../../openpencil-desktop-${{ matrix.label }}.tar.gz openpencil-desktop
      - name: Package archive (windows)
        if: matrix.archive == 'zip'
        shell: pwsh
        run: |
          Compress-Archive `
            -Path target\${{ matrix.target }}\release\openpencil-desktop.exe `
            -DestinationPath openpencil-desktop-${{ matrix.label }}.zip
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: openpencil-desktop-${{ matrix.label }}
          path: |
            openpencil-desktop-${{ matrix.label }}.tar.gz
            openpencil-desktop-${{ matrix.label }}.zip
          if-no-files-found: ignore

  # Phase 1b release wasm artifact: explicitly DEFERRED (not silently
  # dropped). The local C-hard pipeline (vendor/skia-safe-op fork +
  # crates/wasm-libc-shim) does produce a runtime-loadable
  # wasm32-unknown-unknown bundle today (verified 2026-05-09: 0 env.*
  # imports, 597 KiB gzip). Re-introducing the release job requires
  # CI-side automation that we have NOT yet built:
  #   1. install brew emscripten 5.0.7 + EMSDK shim on ubuntu-latest
  #   2. set EMSDK env var for the cargo build
  #   3. run `cargo build … --features skia --release`
  #   4. apply the `.wasm.a` → `.a` symlink hack in the
  #      skia-bindings out/ dir (manual today; tracked as a follow-up
  #      automation item — fold into `vendor/skia-safe-op` build.rs)
  #   5. run `wasm-bindgen --target web` + `wasm-opt -Oz`
  #   6. browser-side manual smoke (Phase E in spec) before publishing
  #
  # Until that pipeline lands, tagged releases ship desktop artifacts
  # only. This is a CONSCIOUS choice — see plan §Cheat-sheet for the
  # tracking item.

  release-draft:
    name: Create / update GitHub Release draft
    # `wasm` job deferred (see comment block above); when the
    # CI-side C-hard pipeline lands, re-add the job and append its
    # name to this `needs:` list.
    needs: [build]
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/v')
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          path: dist
      - name: Flatten artifacts
        run: |
          mkdir -p release-files
          find dist -type f \( -name "*.tar.gz" -o -name "*.zip" \) -exec cp {} release-files/ \;
          ls -la release-files
      - name: Create / update GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          draft: true
          files: release-files/*
          generate_release_notes: true
