#!/bin/bash

output=/dev/stdout

# displays help text
function displayHelp() {
	cat <<HelpText
Usage: compile.sh [OPTION]...

Options:
  -d, --dry      Do not compile
  -g, --git      Add hash of HEAD to filename
  -h, --help     Show this help text
  -s, --sanity   Run sanityCheck
  -q, --quiet    Suppress terminal output
  -t, --themes   Generate theme files
  -m, --minify   Minify output files
  --ci           CI mode
HelpText
}

#display an error message
function echoError() {
	echo -e "\033[0;31m$*\033[0m"
}

#display message
function echoMessage() {
	echo "$1" >"${output}"
}

#compile the HTML file
function compile() {
	mkdir -p bin/resources
	export TWEEGO_PATH=devTools/tweeGo/storyFormats
	TWEEGO_EXE="tweego"

	if hash $TWEEGO_EXE 2>/dev/null; then
		echoMessage "system tweego binary"
	else
		case "$(uname -m)" in
			x86_64 | amd64)
				echoMessage "x64 arch"
				if [ "$(uname -s)" = "Darwin" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_osx64"
				elif [ "$OSTYPE" = "msys" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_win64"
				else
					TWEEGO_EXE="./devTools/tweeGo/tweego_nix64"
				fi
				;;
			x86 | i[3-6]86)
				echoMessage "x86 arch"
				if [ "$(uname -s)" = "Darwin" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_osx86"
				elif [ "$OSTYPE" = "msys" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_win86"
				else
					TWEEGO_EXE="./devTools/tweeGo/tweego_nix86"
				fi
				;;
			*)
				echoError "No system tweego binary found, and no precompiled binary for your platform available."
				echoError "Please compile tweego and put the executable in PATH."
				exit 2
				;;
		esac
	fi

	if [ "$(uname -m)" = "x86_64" ] || [ "$(uname -m)" = "amd64" ]; then
    if [ "$(uname -s)" = "Darwin" ]; then
      MINIFY_EXE="./devTools/minify/minify_darwin_amd64"
    elif [ "$OSTYPE" = "msys" ]; then
      MINIFY_EXE="./devTools/minify/minify_win_amd64.exe"
    else
      MINIFY_EXE="./devTools/minify/minify_linux_amd64"
    fi
	fi

	file="bin/FC_pregmod.html"

	# Find and insert current commit
	if [[ "$ci" ]]; then
		COMMIT=$CI_COMMIT_SHORT_SHA
	elif [[ -d .git ]]; then
		COMMIT=$(git rev-parse --short HEAD)
		if [[ "$usehash" ]]; then
			file="bin/FC_pregmod_${COMMIT}.html"
		fi
	fi
	if [[ "$minify" ]]; then
		final_file=$file
		file="bin/tmp.html"
	fi

	if [[ "$COMMIT" ]]; then
		printf "App.Version.commitHash = '%s';\n" "${COMMIT}" > src/002-config/fc-version.js.commitHash.js
	fi

	devTools/concatFiles.sh js/ '*.js' bin/fc.js
	devTools/concatFiles.sh css/ '*.css' bin/fc.css
	$TWEEGO_EXE -o "$file" --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html src/ || build_failed="true"
	rm -f bin/fc.js
	rm -f bin/fc.css
	if [ "$build_failed" = "true" ]; then
		echoError "Build failed."
		exit 1
	fi

	if [[ "$minify" ]]; then
		if [[ "$MINIFY_EXE" ]]; then
			# SC license is inside an HTML comment, so keep them.
			# eval depends on local variables, so don't modify them (Config, Engine, ...)
			$MINIFY_EXE --html-keep-comments --js-keep-var-names "$file" > "$final_file"
			rm -f "$file"
		else
			echoError "Minification only available on amd64 systems."
			mv "$file" "$final_file"
		fi
		file=$final_file
	fi

	if [[ "$ci" || -d .git ]]; then
		rm src/002-config/fc-version.js.commitHash.js
	fi
	echoMessage "Saved to $file."
}

if [[ "$1" == "" ]]; then
	#tip if no option
	echoMessage "For more options see compile.sh -h."
else
	#parse options
	while [[ "$1" ]]; do
		case $1 in
			-d | --dry)
				dry="true"
				;;
			-g | --git)
				usehash="true"
				;;
			-h | --help)
				displayHelp
				exit 0
				;;
			-s | --sanity)
				sanity="true"
				;;
			-q | --quiet)
				output=/dev/null
				;;
			-t | --themes)
				themes="true"
				;;
			-m | --minify)
				minify="true"
				;;
			--ci)
				ci="true"
				;;
			*)
				echoError "Unknown argument $1."
				displayHelp
				exit 1
				;;
		esac
		shift
	done
fi

# Run sanity check.
[ -n "$sanity" ] && ./sanityCheck.sh

if ! [[ -d .git ]]; then
	echoMessage "No git repository. Git specific actions disabled."
fi

#compile
if [[ "$dry" ]]; then
	echoMessage "Dry run finished."
else
	compile
	echoMessage "Compilation finished at $(date +%T)."
fi

# compile themes
if [[ "$themes" ]]; then
	(
		cd themes/ || exit
		for D in *; do
			if [ -d "${D}" ]; then
				../devTools/concatFiles.sh "${D}"/ '*.css' ../bin/"${D}".css
			fi
		done
	)
	echoMessage "Themes compiled at $(date +%T)"
fi