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

AVEN_INSTALL_DIR="${AVEN_INSTALL_DIR:-$HOME/.local/share/aven-cli}"
AVEN_BIN_DIR="${AVEN_BIN_DIR:-$HOME/.local/bin}"
AVEN_DOWNLOAD_BASE="${AVEN_DOWNLOAD_BASE:-https://aven.example.invalid/downloads}"
AVEN_PACKAGE_NAME="${AVEN_PACKAGE_NAME:-aven-cli.tar.gz}"
AVEN_PACKAGE_URL="${AVEN_PACKAGE_URL:-$AVEN_DOWNLOAD_BASE/$AVEN_PACKAGE_NAME}"

need_command() {
	if ! command -v "$1" >/dev/null 2>&1; then
		echo "Error: required command not found: $1" >&2
		if [ "$1" = "node" ]; then
			echo "Install Node.js 24 LTS in this Linux/WSL environment." >&2
		fi
		exit 1
	fi
}

need_command node
need_command tar

if [ -z "$AVEN_INSTALL_DIR" ] || [ "$AVEN_INSTALL_DIR" = "/" ]; then
	echo "Error: unsafe install directory: $AVEN_INSTALL_DIR" >&2
	exit 1
fi

tmp_dir="$(mktemp -d)"
trap 'rm -rf "$tmp_dir"' EXIT

package_path="$tmp_dir/$AVEN_PACKAGE_NAME"
extract_dir="$tmp_dir/extract"

case "$AVEN_PACKAGE_URL" in
	file://*)
		cp "${AVEN_PACKAGE_URL#file://}" "$package_path"
		;;
	*)
		need_command curl
		curl -fsSL "$AVEN_PACKAGE_URL" -o "$package_path"
		;;
esac

mkdir -p "$extract_dir"
tar -xzf "$package_path" -C "$extract_dir"

staged_dir="$extract_dir/aven-cli"
if [ ! -f "$staged_dir/dist/cli/index.js" ]; then
	echo "Error: package does not contain dist/cli/index.js" >&2
	exit 1
fi

mkdir -p "$(dirname "$AVEN_INSTALL_DIR")"
rm -rf "$AVEN_INSTALL_DIR"
mv "$staged_dir" "$AVEN_INSTALL_DIR"
mkdir -p "$AVEN_BIN_DIR"

cat > "$AVEN_BIN_DIR/aven" <<EOF
#!/usr/bin/env bash
exec node "$AVEN_INSTALL_DIR/dist/cli/index.js" "\$@"
EOF

chmod +x "$AVEN_BIN_DIR/aven"

echo "Aven installed."
echo "Command: $AVEN_BIN_DIR/aven"

case ":$PATH:" in
	*":$AVEN_BIN_DIR:"*) ;;
	*)
		echo "Warning: $AVEN_BIN_DIR is not on PATH."
		echo "Add this to your shell profile:"
		echo "  export PATH=\"\$PATH:$AVEN_BIN_DIR\""
		;;
esac

echo "Try:"
echo "  cd /path/to/project"
echo "  aven project setup --status"
