#!/usr/bin/env bash
#
# This script builds every document in this repo,
# (handout and solutions, if they exist), and creates
# a zip of all resulting files.



# Where we're running this script
run_dir=$(pwd)

# Output files
target_dir="${run_dir}/output"
target_zip="${run_dir}/output.zip"




# Clean up previous build
rm -drf "${target_dir}"
rm -f "${target_zip}"


# Build one document.
# Args: <target_dir> <job_name> <doc_dir> <main_file>
# target_dir: move output pdf to this directory
# job_name: name of this document. Output is saved as job_name.pdf
# doc_dir: cd here before building.
# main_file: build this tex file. Usually main.tex
function build() {
	local target_dir="${1}"
	local job_name="${2}"
	local doc_dir="${3}"
	local main_file="${4}"

	echo "|> Building ${job_name}..."
	cd "${doc_dir}"

	tectonic_args=(
		--chatter minimal
		--web-bundle "https://static.betalupi.com/tectonic/texlive2023.tar"
	)


	# Build handout
	echo "\\def\\argNoSolutions{1}\\input{${main_file}}" | \
		tectonic \
			"${tectonic_args[@]}" \
			--outfmt pdf \
			-

	stat=$?

	if [[ $stat == 0 ]]; then
		mkdir -p "${target_dir}"
		mv texput.pdf "${target_dir}/${job_name}.pdf"
	else
		rmdir --ignore-fail-on-non-empty "${target_dir}"
		rm -f texput.pdf
		echo "|> Handout build failed"
		echo ""
	fi


	# Build solutions
	echo "\\def\\argYesSolutions{1}\\input{${main_file}}" | \
		tectonic \
			"${tectonic_args[@]}" \
			--outfmt pdf \
			-

	stat=$?

	if [[ $stat == 0 ]]; then
		mkdir -p "${target_dir}"
		mv texput.pdf "${target_dir}/${job_name}.sols.pdf"
	else
		rmdir --ignore-fail-on-non-empty "${target_dir}"
		rm -f texput.pdf
		echo "|> Solution build failed"
	fi

	# Clean up if files contents are identical
	if cmp --silent -- "${target_dir}/${job_name}.sols.pdf" "${target_dir}/${job_name}.pdf"; then
		echo "|> Versions identical, removing ${job_name}.sols.pdf"
		rm "${target_dir}/${job_name}.sols.pdf"
	fi

	echo ""

	cd "${run_dir}"
}






for d in "${run_dir}/Misc/Warm-Ups"/*.tex ; do
	file="$(basename "${d}")"
	build \
		"${target_dir}/Warm-Ups" \
		"${file%.*}" \
		"${run_dir}/Misc/Warm-Ups" \
		"${file}"
done

for d in "${run_dir}/Advanced"/*/ ; do
	doc_dir=$(realpath "${d}")
	job_name="$(basename "${doc_dir}")"

	build \
		"${target_dir}/Advanced" \
		"${job_name}" \
		"${doc_dir}" \
		"main.tex"
done

for d in "${run_dir}/Intermediate"/*/ ; do
	doc_dir=$(realpath "${d}")
	job_name="$(basename "${doc_dir}")"

	build \
		"${target_dir}/Intermediate" \
		"${job_name}" \
		"${doc_dir}" \
		"main.tex"
done


# cd so paths in zip are relative
cd "${target_dir}"
zip -FSr "${target_zip}" .