# Build Linux packages and attach them to the Codeberg release when a
# version tag (v*) is pushed.
#
# Codeberg runs Forgejo Actions, which is GitHub-Actions-compatible. The
# heavy lifting is in scripts/package.sh — this workflow just provisions
# a build environment, runs it, and uploads the artifacts.
#
# Manual trigger (workflow_dispatch) is included so you can smoke-test the
# build without cutting a tag; that path builds the packages but skips the
# release-upload step.
name: release

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:

jobs:
  packages:
    runs-on: docker
    # A Debian-based image gives us dpkg + the build toolchain cargo-deb
    # expects, and rustup for a pinned toolchain.
    container:
      image: rust:1.85-bookworm
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install build dependencies
        # libxcb + friends are needed to *link* the eframe/winit GUI even
        # in headless CI. curl + file are used by the packaging script and
        # appimagetool. rpm provides rpmbuild for cargo-generate-rpm's
        # payload assembly on a Debian host. mingw-w64 + zip let the same
        # script cross-compile the Windows .zip from this Linux container.
        run: |
          apt-get update
          apt-get install -y --no-install-recommends \
            libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \
            curl file rpm ca-certificates mingw-w64 zip

      - name: Add Windows cross-compile target
        # package.sh's `all` only builds the Windows zip when this target +
        # mingw + zip are all present (win_available), so this step is what
        # opts the release build into producing yt-offline-*-x86_64-windows.zip.
        run: rustup target add x86_64-pc-windows-gnu

      - name: Cache cargo registry + build
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: cargo-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}

      - name: Build packages
        # FUSE isn't available in most CI containers, so tell appimagetool
        # to extract-and-run instead of mounting. The script downloads
        # appimagetool itself.
        env:
          APPIMAGE_EXTRACT_AND_RUN: '1'
        run: |
          chmod +x scripts/package.sh
          scripts/package.sh all

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

      - name: Upload to release
        # Only attaches to a release when triggered by a tag push. The
        # forgejo-release action creates the release if it doesn't exist
        # and uploads every file under dist/.
        if: startsWith(github.ref, 'refs/tags/v')
        uses: actions/forgejo-release@v2
        with:
          direction: upload
          url: https://codeberg.org
          repo: ${{ github.repository }}
          tag: ${{ github.ref_name }}
          token: ${{ secrets.RELEASE_TOKEN }}
          release-dir: dist
          release-notes: |
            Automated build for ${{ github.ref_name }}.

            Artifacts:
            - `.deb` — Debian / Ubuntu / Mint
            - `.rpm` — Fedora / RHEL / openSUSE
            - `.AppImage` — any Linux (chmod +x and run)
            - `-x86_64-windows.zip` — Windows 10/11 (unzip, run yt-offline.exe)

            Runtime requirements: yt-dlp, ffmpeg, mpv on PATH (plus
            xdg-utils on Linux). The Windows zip's README lists the same.
