#!/usr/bin/env bash

repo_root="$(git rev-parse --show-toplevel)"
if ! pushd "$repo_root" &> /dev/null; then
	echo "Repo doesn't exist!"
	exit 2
fi
td="$(mktemp -d "vdiff.XXXXXXXX")"
trap 'rm -rf '"$td" EXIT
files="$(git diff --name-only "$@")"

args=()
vcmd=""
for f in $files; do
	d="$(dirname "$td/$f")"
	rfn="$(basename "$f")"
	fn="$rfn._@HEAD"
	cfn="$rfn"

	mkdir -p "$d"
	# TODO: show at ref if provided
	git --no-pager show HEAD:"$f" > "$d/$fn" 2>/dev/null || \
		echo "<FILE CREATED>" > "$d/$fn"
	cp "$f" "$d/$cfn" 2>/dev/null || echo "<FILE DELETED>" > "$d/$cfn"

	if [ -z "${args[0]}" ]; then
		args+=("$d/$fn -c")
		vcmd="vert diffsplit $d/$cfn"
	else
		vcmd="$vcmd | tabnew | e $d/$fn | vert diffsplit $d/$cfn"
	fi
done

remaps="nnoremap <leader>k :tabnext<CR> | nnoremap <leader>j :tabprev<CR>"
nvim "${args[@]}" "$vcmd | tabnext | $remaps"

if ! popd &> /dev/null; then
	echo "Could not return to original directory"
	exit 4
fi