#!/bin/sh

status=0

# We need sort from coreutils for -V
case `uname -s` in
	Linux*) SORT=sort ;;
	Darwin*) SORT=gsort ;;
	*) SORT=sort ;;
esac

test_conversion () {
	test=$1
	expected=$(echo $test | sed -e 's/.ledger$/.beancount/')
	actual=$(mktemp)

	printf "Converting $test... "

	config=ledger2beancount.yml
	t=$(echo $test | sed 's/.ledger$//')
	if [ -e $t.yml ]; then
		config=$t.yml
	fi

	../bin/ledger2beancount --config $config $test > $actual

	if $(cmp -s $expected $actual); then
		echo "ok"
	else
		status=1
		echo "FAIL"
		diff -urN $expected $actual | tail -n +3
	fi

	rm -f $actual
}

test_validity_ledger () {
	test=$1
	printf "Validating $test... "
	if ledger --init-file /dev/null -f $test bal > /dev/null; then
		echo "ok"
	else
		echo "FAIL"
		status=1
	fi
}

test_validity_beancount () {
	test=$1
	printf "Validating $test... "

	# Ensure beancount is new enough
	needed=$(grep "^; Beancount:" $test | head -n 1 | sed 's/^; Beancount:\s*//')
	if [ -n "$needed" ]; then
		latest=$(printf "$needed\n$beancount_version" | $SORT -V | tail -n 1)
		if [ "$beancount_version" != "$latest" ]; then
			echo "skipping since beancount is too old"
			return
		fi
	fi

	if bean-check $test; then
		echo "ok"
	else
		echo "FAIL"
		status=1
	fi
}

export LC_ALL=C.UTF-8

ledger_version=$(ledger --version 2>/dev/null | grep "^Ledger [0-9]" | cut -d " " -f 2 | cut -d . -f 1)
if [ -z $ledger_version ]; then
	echo "Skipping ledger validation checks since ledger is not installed"
elif [ $ledger_version -eq 2 ]; then
	echo "Skipping ledger validation checks since ledger 2 is too old"
else
	for test in *.ledger; do
		test_validity_ledger "$test"
	done
fi

for test in *.ledger; do
	test_conversion "$test"
done

beancount_version=$(bean-check --version 2>/dev/null | cut -d' ' -f2)
for test in *.beancount; do
	test_validity_beancount "$test"
done

exit $status

