name: Build Zenyx ⚡

on:
  push:
  pull_request:

jobs:
  setup:
    name: 🔧 Setup Environment
    runs-on: ubuntu-latest
    outputs:
      cache-hit: ${{ steps.cache-tools.outputs.cache-hit }}
    steps:
      - name: 📥 Checkout source
        uses: https://github.com/actions/checkout@v4

      - name: 🗄️ Cache tools
        uses: https://github.com/actions/cache@v4
        id: cache-tools
        with:
          path: |
            ~/.cargo/bin
            /tmp/zig
          key: tools-v1-${{ hashFiles('**/Cargo.lock') }}

      - name: 🦀 Install Rust toolchain
        uses: https://github.com/actions-rs/toolchain@v1
        with:
          toolchain: stable
          components: rust-src
          override: true

      - name: 📦 Install Zig and cargo-zigbuild
        if: steps.cache-tools.outputs.cache-hit != 'true'
        run: |
          mkdir -p /tmp/zig
          curl -L https://ziglang.org/builds/zig-linux-x86_64-0.11.0.tar.xz | tar -xJ -C /tmp/zig --strip-components=1
          curl -L https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
          cargo binstall -y cargo-zigbuild

  build:
    name: 🏗️ Build ${{ matrix.target }}
    needs: setup
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        target:
          - x86_64-unknown-linux-gnu
          - aarch64-unknown-linux-gnu
          - x86_64-pc-windows-msvc
        include:
          - target: x86_64-unknown-linux-gnu
            binary_name: zenyx-x86_64-linux
            ext: ""
          - target: aarch64-unknown-linux-gnu
            binary_name: zenyx-aarch64-linux
            ext: ""
          - target: x86_64-pc-windows-msvc
            binary_name: zenyx-x86_64-windows-msvc.exe
            ext: ".exe"

    steps:
      - name: 📥 Checkout source
        uses: https://github.com/actions/checkout@v4

      - name: 🗄️ Restore tool cache
        uses: https://github.com/actions/cache@v4
        with:
          path: |
            ~/.cargo/bin
            /tmp/zig
          key: tools-v1-${{ hashFiles('**/Cargo.lock') }}

      - name: 📍 Add Zig to PATH
        run: echo "/tmp/zig" >> $GITHUB_PATH

      - name: 🎯 Install Rust target
        uses: https://github.com/actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: ${{ matrix.target }}
          override: true

      - name: 🗄️ Restore Cargo cache
        uses: https://github.com/actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            cargo-${{ matrix.target }}-

      - name: 🚀 Build release binary
        run: cargo zigbuild --target ${{ matrix.target }} --release

      - name: 📦 Package artifact
        run: |
          mkdir -p artifacts
          cp target/${{ matrix.target }}/release/zenyx${{ matrix.ext }} artifacts/${{ matrix.binary_name }}

      - name: ⬆️ Upload artifact
        uses: https://code.forgejo.org/forgejo/upload-artifact@v4
        with:
          name: ${{ matrix.binary_name }}
          path: artifacts/${{ matrix.binary_name }}