#!/bin/bash

expected_mount_point=""

function usage
{
	retval="$1"
	case "$retval" in
		0)
			;;
		*)
			exec 1>&2
			;;
	esac
	echo "Usage: $0 --mount-point /mnt --help"
	echo
	echo "Accepts df output on stdin.  Returns bytes in use."
	exit "$retval"
}

while [ "$#" -ge 1 ]
do
	case "$1" in
		--mount-point)
			expected_mount_point="$2"
			shift
			;;
		--help|-h)
			usage 0
			;;
		*)
			echo "$0: unrecognized option: $1" 1>&2
			usage 1
			;;
	esac
	shift
done

all_good=True

tab="$(printf '\t')"

case "$expected_mount_point" in
	"")
		echo "$0: --mount-point is a required option" 1>&2
		all_good=False
		;;
	*' '*|*"$tab"*)
		echo "$0: --mount-point must not specify a mount point with spaces or tabs in it" 1>&2
		all_good=False
		;;
esac

df_output=$(set -eu; cat)

line_count=$(echo "$df_output" | wc -l)
if [ "$line_count" != 2 ]
then
	echo "$0: df line count not 2: $line_count" 1>&2
	all_good=False
fi

case "$all_good" in
	True)
		;;
	False)
		echo "$0: One or more items in the preflight check failed"
		exit 1
		;;
	*)
		echo "$0: internal error: \$all_good neither True nor False: $all_good" 1>&2
		exit 1
		;;
esac

header_line=$(echo "$df_output" | head -1 | tr '[:upper:]' '[:lower:]')
stats_line=$(echo "$df_output" | head -2 | tail -1)

if echo "$header_line" | grep -Eq "^filesystem  *1k-blocks  *used  *available  *use%  *mounted on$"
then
	one_k_blocks=$(echo "$stats_line" | awk ' { print $3 }')
	actual_mount_point=$(echo "$stats_line" | awk ' { print $6 }')
elif echo "$header_line" | grep -Eq "^filesystem  *1024-blocks  *used  *available  *capacity  *iused  *ifree  *%iused  *mounted on$"
then
	one_k_blocks=$(echo "$stats_line" | awk ' { print $3 }')
	actual_mount_point=$(echo "$stats_line" | awk ' { print $9 }')
else
	echo "$0: Error: This does not appear to be a Linux or MacOS df -k." 1>&2
	exit 1
fi

if [ "$expected_mount_point" != "$actual_mount_point" ]
then
	echo "$0: error: \$expected_mount_point != \$actual_mount_point: $expected_mount_point $actual_mount_point" 1>&2
	exit 1
fi

echo $((one_k_blocks * 1024))