#! /bin/bash

# Setup paths
WORKDIR="${TMPDIR:-/tmp}/starkit2exe-$$${RANDOM}${RANDOM}${RANDOM}${RANDOM}"
STARTDIR="$(readlink -f "$(pwd)")"

# Process script arguments and expand to fully qualified names where appropriate
OURSCP="$(readlink -f "$0" 2>/dev/null)"
OURSCPDIR="$(dirname "${OURSCP}" 2>/dev/null)"
TCLKIT=$(for chk_os in $(uname -s) $(uname -s | dd conv=lcase 2>/dev/null) $(uname -s | dd conv=lcase 2>/dev/null)$(uname -r | cut -f 1 -d .) $(uname -s | dd conv=lcase 2>/dev/null)$(uname -r | cut -f 1-2 -d .); do
	for chk_arch in $(uname -m) $(uname -m | dd conv=lcase 2>/dev/null) $(uname -m | dd conv=lcase 2>/dev/null | sed 's@i.86@x86@;s@sun4.@sparc@'); do
		for chk_kit in ${OURSCPDIR}/tclkits/tclkit-*-${chk_os}-${chk_arch}-static ${OURSCPDIR}/tclkits/tclkit-*-${chk_os}-${chk_arch}; do
			if [ -x "${chk_kit}" ]; then
				echo "${chk_kit}"
			fi
		done
	done
done | sort -rn | head -n 1)
SDXPATH="${OURSCPDIR}/support/sdx.kit"
SRCTCLKIT="$(readlink -f "$1" 2>/dev/null)"
OUTPUT="$2"
DESTTCLKIT="$(readlink -f "$3" 2>/dev/null)"
if [ -z "${TCLKIT}" ]; then
	echo 'Unable to locate a suitable Tclkit' >&2
	exit 1
fi
if [ -f "${SRCTCLKIT}" -o -d "${SRCTCLKIT}" ]; then
	true
else
	echo 'SRCTCLKIT is not a regular file or directory' >&2
	SRCTCLKIT=""
fi
if [ -z "${SRCTCLKIT}" -o -z "${OUTPUT}" ]; then
	echo 'Usage: starkit2exe <srckit> <output> [<dest_tclkit>]' >&2

	exit 1
fi

if [ -z "${DESTTCLKIT}" ]; then
	echo "Using Tclkit: $(basename "${TCLKIT}" 2>/dev/null)"
else
	echo "Using Tclkit: $(basename "${TCLKIT}" 2>/dev/null), generating with $(basename "${DESTTCLKIT}" 2>/dev/null)"
fi

# Abort on failure of any command
set -e

# Create working area
mkdir -p "${WORKDIR}"
chmod 700 "${WORKDIR}"
cd "${WORKDIR}"

# Extract starkit and rename to make things easier
if [ -d "${SRCTCLKIT}" ]; then
	cp -a "${SRCTCLKIT}" output.vfs
else
	"${TCLKIT}" "${SDXPATH}" unwrap "${SRCTCLKIT}"
	mv *.vfs output.vfs
fi

# Create temporary Tclkit if needed
if [ -n "${DESTTCLKIT}" ]; then
	if [ "$(readlink -f "${TCLKIT}")" = "$(readlink -f "${DESTTCLKIT}")" ]; then
		DESTTCLKIT=""
	fi
fi
if [ -z "${DESTTCLKIT}" ]; then
	DESTTCLKIT="${WORKDIR}/copykit"
	cp "${TCLKIT}" "${DESTTCLKIT}"
fi

# Determine platform of destination starpack
DESTPLATFORM_FILE=$(file "${DESTTCLKIT}" | sed 's@^[^:]*: *@@')
DESTOS="Unknown"
case "${DESTPLATFORM_FILE}" in
	Mach-O\ *|compiled\ Java\ class\ data,\ version\ 2.0)
		DESTOS="MacOS"
		;;
	ELF\ 32-bit\ *\ version\ 1\ \(SYSV\),\ *)
		DESTOS="Linux"
		;;
	ELF\ 32-bit\ *\ version\ 1\ \(FreeBSD\),\ *)
		DESTOS="FreeBSD"
		;;
	MS-DOS\ executable\ *)
		DESTOS="Windows"
		;;
esac

# Create starpack
"${TCLKIT}" "${SDXPATH}" wrap output -runtime "${DESTTCLKIT}"

# Enable platform-specific fix-ups (post-wrap)
case "${DESTOS}" in
	MacOS)
		APPNAME=$(basename "${OUTPUT}" .zip)
		mkdir -p "${APPNAME}.app/Contents/MacOS"
		mv output "${APPNAME}.app/Contents/MacOS/${APPNAME}"
		zip -r output.zip "${APPNAME}.app"
		mv output.zip output
		;;
esac

# Copy starpack to output
STARPACKFILE="$(readlink -f output 2>/dev/null)"
if [ -z "${STARPACKFILE}" ]; then
	echo 'Failed to create starpack, leaving temporary directory intact for inspection.' >&2
	exit 1
fi
cd "${STARTDIR}"
cp -a "${STARPACKFILE}" "${OUTPUT}"

# Cleanup
rm -rf "${WORKDIR}"
