#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat <<'EOF'
Usage:
  node-with-fnm --version 18|20|22 --shell-command 'cd /path && npm ci'
  node-with-fnm --user git --version 22 --shell-command 'cd /path && npm start'
  node-with-fnm --help
EOF
}

run_user=""
node_version=""
shell_command=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --user) run_user="${2:-}"; shift 2 ;;
    --version) node_version="${2:-}"; shift 2 ;;
    --shell-command) shell_command="${2:-}"; shift 2 ;;
    --help|-h) usage; exit 0 ;;
    *) echo "Unknown argument: $1" >&2; usage; exit 2 ;;
  esac
done

[[ -n "$node_version" && -n "$shell_command" ]] || { usage; exit 2; }

if [[ -z "$run_user" ]]; then
  run_user="$(id -un)"
fi

runner=$(cat <<'EOS'
set -euo pipefail
export FNM_DIR="${FNM_DIR:-$HOME/.local/share/fnm}"
fnm_bin="$FNM_DIR/fnm"
[[ -x "$fnm_bin" ]] || { echo "fnm not found: $fnm_bin" >&2; exit 1; }
eval "$("$fnm_bin" env --shell bash)"
exec "$fnm_bin" exec --using=__NODE_VERSION__ bash -lc __SHELL_COMMAND__
EOS
)
runner="${runner/__NODE_VERSION__/$node_version}"
printf -v quoted_command '%q' "$shell_command"
runner="${runner/__SHELL_COMMAND__/$quoted_command}"

if [[ "$run_user" == "$(id -un)" ]]; then
  exec bash -lc "$runner"
fi

if [[ $(id -u) -ne 0 ]]; then
  echo "Cannot switch to user $run_user without root" >&2
  exit 1
fi

exec sudo -u "$run_user" bash -lc "$runner"
