#!/bin/bash

LDCONFIG=/sbin/ldconfig

error() {
	echo $* >&2
}

check_program() {
	which $1 > /dev/null 2>&1 && [ -x $(which $1) ]
	return $?
}

check_lib() {
	/sbin/ldconfig -p | grep "^[[:space:]]*$1 " > /dev/null
	return $?
}

check_header() {
	[ -n "$(find /usr/include/ /usr/local/include/ -path "*/$1" 2>/dev/null)" ]
	return $?
}

check_requisite() {
	case "$2" in
		program)
			check_program "$@"
			return $?
			;;
		lib)
			check_lib "$@"
			return $?
			;;
		header)
			check_header "$@"
			return $?
			;;
		*)
			error "Unknown requisite type: $2"
			exit 1
			;;
	esac
}

failed_requisite() {
	local required
	if $3; then
		required="WARNING"
	else
		required="ERROR"
	fi
	case "$2" in
		program)
			echo "$required: The program $1 was not found in path."
			;;
		lib)
			echo "$required: The library $1 was not found in /etc/ld.so.cache."
			;;
		header)
			echo "$required: The header file $1 was not found in /usr/(local/)include."
			;;
		*)
			error "Unknown requisite type: $2"
			exit 1
			;;
	esac
}

declare -a req
parser=
warn=false

while [ $# -gt 0 ]; do
	case "$1" in
		-h|--header)
			parser=header
			warn=false
			;;
		-l|--lib)
			parser=lib
			warn=false
			;;
		-p|--program)
			parser=program
			warn=false
			;;
		-w|--warn)
			if [ "" != "$parser" ]; then
				warn=true
			fi
			;;
		*)
			if [ "" != "$parser" ]; then
				req[${#req[*]}]="$1"
				req[${#req[*]}]=$parser
				req[${#req[*]}]=$warn
			else
				error "Invalid argument: $1"
				exit 1
			fi
			warn=false
	esac
	shift
done

err=0
i=0
while [ $i -lt ${#req[*]} ]; do
	if ! check_requisite "${req[$i]}" ${req[$((i+1))]} ${req[$((i+2))]}; then
		failed_requisite "${req[$i]}" ${req[$((i+1))]} ${req[$((i+2))]}
		if ! ${req[$((i+2))]}; then
			err=1
		fi
	fi
	i=$((i+3))
done

exit $err