#!/usr/bin/bash

set -euo pipefail

cd "$(dirname "${BASH_SOURCE[0]}")"

YEAR=2020

export COMMON_DIR="$(realpath common)"

run_solution() {
	if [ -d "$solution" ]; then
		if [ -f "$solution/Cargo.toml" ]; then
			cargo run --quiet --manifest-path "$solution/Cargo.toml" < "$input"
		else
			runfile=$solution/run.sh
			[ -f "$runfile" ] || { echo "Error: $runfile not found" >&2; exit 1; }
			"$runfile" "$input"
		fi
	else
		case "$(basename "$solution")" in
			*.hs)
				runhaskell -icommon "$solution" < "$input"
				;;
			*.py)
				python "$solution" < "$input"
				;;
			*)
				echo "Error: Unknown solution type: $solution" >&2
				exit 1
				;;
		esac
	fi
}

shopt -s dotglob nullglob

for n in $(seq 1 25); do
	input=$YEAR/data/day$n.input
	expected=$YEAR/data/day$n.expected

	for solution in "$YEAR/day$n"/*; do
		echo -n "$solution... "

		case "${solution##*/}" in
			example*)
				echo SKIP
				continue
		esac

		solution_output=$(mktemp)
		trap "rm -f '$solution_output'" EXIT

		run_solution "$solution" > "$solution_output"

		if ! diff -u "$expected" "$solution_output"; then
			echo FAIL
			rv=$?
			case "$rv" in
				1)
					exit 2
					;;
				*)
					exit 1
					;;
			esac
		else
			echo ok
		fi

		rm "$solution_output"
	done
done
