#!/bin/sh

ARCH="x86"
OS="linux"

PROGRAM="mli-${ARCH}"

MLI_SRC_DIR="src"
MLI_BIN_DIR="bin"
MLI_DOC_DIR="doc"
MLI_MISC_DIR="misc"

MLI_SRC="${PROGRAM}.src"
MLI_MAP="${PROGRAM}.map"
MLI_OBJ="${PROGRAM}.obj"
MLI_BIN="${PROGRAM}"
MLI_GDB="${PROGRAM}.gdb"
MLI_MAN="${PROGRAM}.1"

PREFIX="${PREFIX:-/usr/local}"
PREFIX_BIN_DIR="${PREFIX}/bin"
PREFIX_MAN_DIR="${PREFIX}/share/man/man1"
PREFIX_SHARE_PROGRAM_DIR="${PREFIX}/share/${PROGRAM}"

PLAN="${PLAN:-${PREFIX}/share/shelf/${ARCH}/${OS}/flat.plan}"
SHELF="${SHELF:-shelf}"
MLE="${MLE:-mle}"

set -e

usage()
{
	printf "usage: setup {build|clean|install|uninstall}\n"
}

error()
{
	printf "? %s\n" "$1" 1>&2
}

check_command()
{
	if ! command -v "$1" >/dev/null 2>&1
	then
		error "$1 not found"
		return 1
	fi
}

check_file()
{
	if ! [ -f "$1" ]
	then
		error "$1 not found"
		return 1
	fi
}

build()
{
	check_command "${MLE}"
	check_command "${SHELF}"
	check_file "${PLAN}"

	set -x

	"${MLE}" -o "${MLI_SRC_DIR}/${MLI_OBJ}" \
	         -m "${MLI_SRC_DIR}/${MLI_MAP}" \
	            "${MLI_SRC_DIR}/${MLI_SRC}"

	mkdir -p "${MLI_BIN_DIR}"
	"${SHELF}" "${PLAN}" "${MLI_SRC_DIR}/${MLI_OBJ}" \
	                   > "${MLI_BIN_DIR}/${MLI_BIN}"

	chmod 755 "${MLI_BIN_DIR}/${MLI_BIN}"
}

clean()
{
	set -x

	rm -f "${MLI_BIN_DIR}/${MLI_BIN}" \
	      "${MLI_SRC_DIR}/${MLI_OBJ}" \
	      "${MLI_SRC_DIR}/${MLI_MAP}"
}

install()
{
	check_file "${MLI_BIN_DIR}/${MLI_BIN}"

	set -x

	mkdir -p "${PREFIX_BIN_DIR}"
	cp "${MLI_BIN_DIR}/${MLI_BIN}" "${PREFIX_BIN_DIR}/"
	ln -nsf "${MLI_BIN}" "${PREFIX_BIN_DIR}/mli"

	mkdir -p "${PREFIX_MAN_DIR}"
	cp "${MLI_DOC_DIR}/${MLI_MAN}" "${PREFIX_MAN_DIR}/"
	ln -nsf "${MLI_MAN}" "${PREFIX_MAN_DIR}/mli.1"

	mkdir -p "${PREFIX_SHARE_PROGRAM_DIR}"
	cp "${MLI_MISC_DIR}/${MLI_GDB}" "${PREFIX_SHARE_PROGRAM_DIR}/"
}

uninstall()
{
	set -x

	rm -f "${PREFIX_BIN_DIR}/${MLI_BIN}" \
	      "${PREFIX_BIN_DIR}/mli" \
	      "${PREFIX_MAN_DIR}/${MLI_MAN}" \
	      "${PREFIX_MAN_DIR}/mli.1"

	rm -rf "${PREFIX_SHARE_PROGRAM_DIR}"
}

main()
{
	case $# in
	(1)
		case $1 in
		("build")
			build
			;;

		("clean")
			clean
			;;

		("install")
			install
			;;

		("uninstall")
			uninstall
			;;

		(*)
			usage
			;;
		esac
		;;

	(*)
		usage
		;;
	esac
}

main "$@"
