#! /bin/bash

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

# Process script arguments and expand to fully qualified names where appropriate
TCL2BINDIR=$(dirname $(readlink -f "$0"))
if [ -z "${TCL2BINDIR}" ]; then
	TCL2BINDIR=$(dirname $(which "$0"))
fi
if [ -z "${TCL2BINDIR}" ]; then
	echo 'Error: Unable to find myself, aborting.' >&2
	exit 1
fi

TCLKIT="${TCL2BINDIR}/build/tclkit-8.4.17-linux-x86-static"
SDXPATH="${TCL2BINDIR}/build/sdx.kit"
OUTPUT="$1"
SOURCEFILE="$2"
DESTTCLKIT=""
if [ ! -x "${TCLKIT}" ]; then
	if [ -n "${TCLKIT}" ]; then
		echo 'TCLKIT specified is not executable.' >&2
		TCLKIT=""
	fi
fi
if [ -n "${DESTTCLKIT}" -a \( ! -e "${DESTTCLKIT}" -o "${DESTTCLKIT}" = "${TCLKIT}" \) ]; then
	DESTTCLKIT=""
fi
if [ -z "${TCLKIT}" -o -z "${SDXPATH}" -o -z "${OUTPUT}" -o -z "${SOURCEFILE}" ]; then
	echo 'Usage: tcl2bin <output> <file1> [<file2> [<file3> [...]]]' >&2

	exit 1
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
mkdir output.vfs || exit 1
shift
VFSDIR=$(readlink -f output.vfs)
export VFSDIR
(
	cd "${STARTDIR}" || exit 1
	cp "$@" "${VFSDIR}" || exit 1
) || exit 1

cat <<\__EOF__ > output.vfs/main.tcl
package require starkit
starkit::startup
                                                                                                                                            
set mytopdir $starkit::topdir                                                                                                               
__EOF__
echo "source \$mytopdir/${SOURCEFILE}" >> output.vfs/main.tcl

# Create temporary Tclkit if needed
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}"
