#!/bin/bash
# Rebuild the bernina python pixi env in an isolated local sandbox.
#
# Copies pixi.toml/pixi.lock (and pixi_dev.toml, if present) from the
# shared project at SOURCE_DIR into <local-folder>, runs `pixi update`
# there to refresh the lock file, then `pixi install --all` to (re)build
# every environment defined in pixi.toml. Package downloads are cached
# under a shared cache dir on /sf/bernina (group-writable, umask forced
# to 002 below since this NFS export doesn't support default ACLs and
# setgid alone won't make new files group-writable) so downloads are
# reused across users, not just across your own runs. SOURCE_DIR itself
# is never touched -- promote the result manually once you're happy
# with it.
#
# For the per-host ~/bpy mirror that startup_bernina_terminal keeps in
# sync automatically (install once, resync on change, no `pixi update`),
# see pixi_local_sync instead.
set -euo pipefail

SOURCE_DIR="/sf/bernina/applications/python"
PIXI_BIN="/usr/bin/pixi"                                # console (system) pixi first
[ -x "$PIXI_BIN" ] || PIXI_BIN="/sf/bernina/bin/pixi"   # fallback, e.g. on ra (RHEL8)
export PIXI_CACHE_DIR="/sf/bernina/misc/pixi-cache"

usage() {
    echo "Usage: $(basename "$0") <local-folder>" >&2
    echo "" >&2
    echo "  Rebuilds the pixi lock file and all environments from" >&2
    echo "  $SOURCE_DIR/pixi.toml inside <local-folder>," >&2
    echo "  without touching $SOURCE_DIR." >&2
    exit 1
}

[ $# -eq 1 ] || usage
LOCAL_DIR="$1"

command -v "$PIXI_BIN" >/dev/null 2>&1 || PIXI_BIN="pixi"
command -v "$PIXI_BIN" >/dev/null 2>&1 || { echo "error: pixi not found" >&2; exit 1; }

[ -f "$SOURCE_DIR/pixi.toml" ] || { echo "error: no pixi.toml at $SOURCE_DIR" >&2; exit 1; }

mkdir -p "$LOCAL_DIR"
umask 002
mkdir -p "$PIXI_CACHE_DIR"
chmod 2775 "$PIXI_CACHE_DIR"

cp -v "$SOURCE_DIR/pixi.toml" "$LOCAL_DIR/"
[ -f "$SOURCE_DIR/pixi.lock" ] && cp -v "$SOURCE_DIR/pixi.lock" "$LOCAL_DIR/"
[ -f "$SOURCE_DIR/pixi_dev.toml" ] && cp -v "$SOURCE_DIR/pixi_dev.toml" "$LOCAL_DIR/"

cd "$LOCAL_DIR"

echo "==> using package cache: $PIXI_CACHE_DIR"
echo "==> updating lock file in $LOCAL_DIR"
"$PIXI_BIN" update

echo "==> installing all environments"
"$PIXI_BIN" install --all

cat <<EOF

Done. Rebuilt lock file + environments live in: $LOCAL_DIR
$SOURCE_DIR was NOT modified.

If this looks good, promote the lock file, e.g.:
  cp $LOCAL_DIR/pixi.lock $SOURCE_DIR/pixi.lock
EOF
