#!/usr/bin/env sh
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2014,2015,2020,2021,2023 Leah Rowe <leah@libreboot.org>
# SPDX-FileCopyrightText: 2015 Patrick "P. J." McDermott <pj@pehjota.net>
# SPDX-FileCopyrightText: 2015, 2016 Klemens Nanni <contact@autoboot.org>
# SPDX-FileCopyrightText: 2022, Caleb La Grange <thonkpeasant@protonmail.com>

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

. "include/err.sh"
. "include/option.sh"

eval "$(setvars "" option aur_notice tmpdir)"

tmpdir_was_set="y"
set | grep TMPDIR 1>/dev/null 2>/dev/null || tmpdir_was_set="n"
if [ "${tmpdir_was_set}" = "y" ]; then
	tmpdir="${TMPDIR##*/}"
	tmpdir="${TMPDIR%_*}"
	if [ "${tmpdir}" = "lbmk" ]; then
		tmpdir=""
		tmpdir_was_set="n"
	fi
fi
if [ "${tmpdir_was_set}" = "n" ]; then
	export TMPDIR="/tmp"
	tmpdir="$(mktemp -d -t lbmk_XXXXXXXX)"
	export TMPDIR="${tmpdir}"
else
	export TMPDIR="${TMPDIR}"
fi
tmpdir="${TMPDIR}"

linkpath="${0}"
linkname="${linkpath##*/}"
buildpath="./script/${linkname}"

main()
{
	xx_ id -u 1>/dev/null 2>/dev/null
	[ $# -lt 1 ] && fail "Too few arguments. Try: ${0} help"
	[ "${1}" = "dependencies" ] && xx_ install_packages $@ && lbmk_exit 0

	initialise_command $@ && shift 1

	check_git
	check_project "fail"

	execute_command $@
	lbmk_exit 0
}

initialise_command()
{
	[ "$(id -u)" != "0" ] || fail "this command as root is not permitted"

	case "${1}" in
	help) usage ${0} && lbmk_exit 0 ;;
	list) items "${buildpath}" && lbmk_exit 0 ;;
	esac
	option="${1}"
}

install_packages()
{
	if [ $# -lt 2 ]; then
		printf "You must specify a distro, namely:\n" 1>&2
		printf "Look at files under config/dependencies/\n" 1>&2
		printf "Example: ./build dependencies debian\n" 1>&2
		fail "install_packages: target not specified"
	fi

	[ -f "config/dependencies/${2}" ] || fail "Unsupported target"

	. "config/dependencies/${2}"

	xx_ ${pkg_add} ${pkglist}
	[ -z "${aur_notice}" ] && return 0
	printf "You must install AUR packages: %s\n" "${aur_notice}" 1>&2
}

execute_command()
{
	lbmkcmd="${buildpath}/${option}"
	[ -f "${lbmkcmd}" ] || fail "Invalid command. Run: ${linkpath} help"
	"${lbmkcmd}" $@ || fail "execute_command: ${lbmkcmd} ${@}"
}

usage()
{
	progname=${0}
	cat <<- EOF
	USAGE:	${progname} <OPTION>

	possible values for 'OPTION':
	$(items "${buildpath}")

	Refer to ${projectname} documentation for more info.
	EOF
}

lbmk_exit()
{
	tmp_cleanup || err "lbmk_exit: can't rm tmpdir upon exit $1: ${tmpdir}"
	exit $1
}

fail()
{
	tmp_cleanup || printf "WARNING: can't rm tmpdir: %s\n" "${tmpdir}" 1>&2
	err "${1}"
}

tmp_cleanup()
{
	[ "${tmpdir_was_set}" = "n" ] || return 0
	rm -Rf "${tmpdir}" || return 1
}

main $@