#!/bin/bash -efu
#
# Launcher for bcc tools
#
# Copyright (c) 2022 Vitaly Chikunov <vt@altlinux.org>

toolsdir="/usr/share/bcc/tools"

list_commands() {
	local lib
	for lib in "${@-}"; do
		find "$toolsdir$lib" -maxdepth 1 -type f -perm /1 -printf '%f\n'
	done | sort
}

usage() {
	echo "bcc-tools launcher"
	echo "Usage: bcc <command> [command options, such as --help]"
	echo
	echo "Available commands:"
	cd "$toolsdir"
	ls -d -x --color=auto $(list_commands)
	echo
	echo "Run 'bcc <command> --man' to see manual page for the command (if available)."
	echo "  Or run 'man bcc-<command>' directly."
	echo "Run 'bcc <command> --example' to see usage example for the command (if available)."
	echo
	echo "Add '$toolsdir' to the PATH to run commands directly, eg:"
	echo "	PATH=\$PATH:$toolsdir"
	exit 0
}
[ -n "${1-}" ] || usage

declare -a args
for opt; do
	case "$opt" in
		--help) usage ;;
		--list-commands) list_commands / /lib; exit ;;
		-*) args+=("$opt") ;;
		*) cmd="$opt"; break ;;
	esac
	shift
done
[ -n "${cmd:-}" ] || usage
cmd=$(basename "$cmd")
for lib in '/' '/lib/' ''; do
	if [ -z "$lib" ]; then
		echo >&2 "No such command '$cmd', run 'bcc' to see list of available commands."
		exit 1
	fi
	[ -f "$toolsdir$lib$cmd" ] && [ -x "$toolsdir$lib$cmd" ] && break
done
# Rewind prepended options after cmd.
set -- "${args[@]}" "$@"

# Handle special (global) options ourselves.
for opt; do
	case "$opt" in
		--man)
			AutoReq=no man "bcc-$cmd"
			exit
			;;
		--example*)
			example="$toolsdir/doc$lib${cmd}_example.txt"
			if [ -s "$example" ]; then
				less "$example"
				exit
			else
				echo >&2 "No example for '$cmd'."
				exit 1
			fi
			;;
		--source)
			if type pygmentize3 >/dev/null 2>&1; then
				pygmentize3 < "$toolsdir$lib$cmd" | less -R
			else
				less "$toolsdir$lib$cmd"
			fi
			exit
			;;
	esac
done
shift
exec "$toolsdir$lib$cmd" "$@"
