#!/bin/sh

# SPDX-FileCopyrightText: © 2018 Martin Michlmayr <tbm@cyrius.com>

# SPDX-License-Identifier: GPL-3.0-or-later

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... "
	tmp=$(tempfile)
	ledger --init-file /dev/null -f $test bal > $tmp 2>&1
	# Ignore errors due to missing Python support
	errors=$(grep "^Error:" $tmp | grep -v "^Error: 'python' directive seen" | \
		grep -v "^Error: 'import' directive seen" | \
		grep -v "^Error: Unknown identifier 'print_type'$")
	if [ -z "$errors" ]; then
		echo "ok"
	else
		echo "FAIL"
		cat $tmp
		status=1
	fi
	rm -f $tmp
}

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_date=$(ledger --version 2>/dev/null | grep "^Ledger [0-9]" | cut -d " " -f 2 | cut -d - -f 2 | sed 's/,//')
if [ -z $ledger_date ]; then
	echo "Skipping ledger validation checks since ledger is not installed"
elif [ $ledger_date -lt 20190205 ]; then
	echo "Skipping ledger validation checks since ledger from $ledger_date 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

