from pathlib import Path
import subprocess

def build(
		path: Path,
		*,
		solutions: bool = True,
		mainfile: str = "main.tex",
		jobname: str = "main",
		build_dir: Path = Path("build"),

		test = False,
		env: dict = {},
	) -> Path:
	"""
	Build a directory using XeTeX.

	Args:
		path (Path): directory to build
		solutions (bool, optional): Create a handout with solutions? Defaults to True.
		mainfile (str, optional): Path to main TeX file, relative to path. Defaults to "main.tex".
		jobname (str, optional): TeX job name. Defaults to "main".
		build_dir (Path, optional): Where to place build files. Defaults to Path("build").

		test (bool, optional): If true, dry run. Defaults to False.
		env (dict): Dictionary of environment variables.

	Returns:
		Path: Absolute path to output pdf.
	"""

	# Make temporary file for TeX build arg hack
	if solutions:
		with (build_dir/"tmp.tex").open("w") as f:
			f.write("\\def\\argYesSolutions{1}\\input{" + mainfile + "}")
	else:
		with (build_dir/"tmp.tex").open("w") as f:
			f.write("\\def\\argNoSolutions{1}\\input{" + mainfile + "}")

	cmd = subprocess.run([
			"latexmk",
			"-interaction=nonstopmode",
			"-file-line-error",
			f"-outdir={build_dir}",
			"-xelatex",
			f"-jobname={jobname}",
			build_dir/"tmp.tex"
		],
		cwd = path,
		env = env,
		stdout = None if test else subprocess.DEVNULL,
		stderr = None if test else subprocess.DEVNULL
	)

	assert cmd.returncode == 0

	# Remove tmp file
	(build_dir / "tmp.tex").unlink()

	return build_dir / f"{jobname}.pdf"