name: Release

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

permissions:
  contents: write

jobs:
  build:
    strategy:
      matrix:
        include:
          - os: macos-latest
            target: darwin-arm64
          - os: macos-15-intel
            target: darwin-x64
          - os: ubuntu-latest
            target: linux-x64
          - os: ubuntu-24.04-arm
            target: linux-arm64
          - os: windows-latest
            target: win32-x64
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4

      - uses: oven-sh/setup-bun@v2
        with:
          bun-version: latest

      - name: Install dependencies
        run: bun install --frozen-lockfile

      - name: Build release bundle
        run: bun run build:release

      - name: Package (Unix)
        if: runner.os != 'Windows'
        run: |
          mkdir -p release/node_modules

          # Copy all build outputs (cli.js + tree-sitter wasm/scm assets)
          cp dist/* release/
          mv release/cli.js release/appicons.js

          # Copy Sharp native modules (both sharp-{platform} and sharp-libvips-{platform})
          if [ -d "node_modules/sharp" ]; then
            cp -r node_modules/sharp release/node_modules/
          fi
          if [ -d "node_modules/@img" ]; then
            mkdir -p release/node_modules/@img
            for dir in node_modules/@img/*-${{ matrix.target }}; do
              [ -d "$dir" ] && cp -r "$dir" release/node_modules/@img/
            done
          fi

          # Copy OpenTUI native modules
          if [ -d "node_modules/@opentui/core" ]; then
            mkdir -p release/node_modules/@opentui
            cp -r node_modules/@opentui/core release/node_modules/@opentui/
          fi
          if [ -d "node_modules/@opentui/core-${{ matrix.target }}" ]; then
            cp -r "node_modules/@opentui/core-${{ matrix.target }}" release/node_modules/@opentui/
          fi

          tar -czvf appicons-${{ matrix.target }}.tar.gz -C release .

      - name: Package (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          New-Item -ItemType Directory -Force -Path release/node_modules

          # Copy all build outputs (cli.js + tree-sitter wasm/scm assets)
          Copy-Item dist/* release/
          Rename-Item release/cli.js appicons.js

          # Copy Sharp native modules (both sharp-{platform} and sharp-libvips-{platform})
          if (Test-Path "node_modules/sharp") {
            Copy-Item -Recurse node_modules/sharp release/node_modules/
          }
          if (Test-Path "node_modules/@img") {
            New-Item -ItemType Directory -Force -Path "release/node_modules/@img"
            Get-ChildItem -Path "node_modules/@img" -Directory -Filter "*-${{ matrix.target }}" | ForEach-Object {
              Copy-Item -Recurse $_.FullName "release/node_modules/@img/"
            }
          }

          # Copy OpenTUI native modules
          if (Test-Path "node_modules/@opentui/core") {
            New-Item -ItemType Directory -Force -Path "release/node_modules/@opentui"
            Copy-Item -Recurse "node_modules/@opentui/core" "release/node_modules/@opentui/"
          }
          if (Test-Path "node_modules/@opentui/core-${{ matrix.target }}") {
            Copy-Item -Recurse "node_modules/@opentui/core-${{ matrix.target }}" "release/node_modules/@opentui/"
          }

          Compress-Archive -Path release/* -DestinationPath appicons-${{ matrix.target }}.zip

      - uses: actions/upload-artifact@v4
        with:
          name: appicons-${{ matrix.target }}
          path: |
            appicons-${{ matrix.target }}.tar.gz
            appicons-${{ matrix.target }}.zip
          if-no-files-found: ignore

  release:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          path: artifacts
          merge-multiple: true

      - name: List artifacts
        run: ls -la artifacts/

      - uses: softprops/action-gh-release@v2
        with:
          files: |
            artifacts/*.tar.gz
            artifacts/*.zip
          draft: false
