#!/usr/bin/env bash
# Make sure the current directory is the location of this script to simplify matters
cd "$(dirname "$(readlink -f "$0")")";
################
### Settings ###
################

# The name of this project
project_name="pepperminty.wiki";

# The path to the lantern build engine git submodule
lantern_path="./lantern-build-engine";

###
# Custom Settings
###

config="./.eleventy.js"; # relative to src/
output_dir="${PWD}/public";
port_number="5726"

###############################################################################

# Check out the lantern git submodule if needed
if [ ! -f "${lantern_path}/lantern.sh" ]; then git submodule update --init "${lantern_path}"; fi

source "${lantern_path}/lantern.sh";

if [[ "$#" -lt 1 ]]; then
	echo -e "${FBLE}${project_name}${RS} build script";
	echo -e "    by Starbeamrainbowlabs";
	echo -e "${LC}Powered by the lantern build engine, v${version}${RS}";
	echo -e "";
	echo -e "${CSECTION}Usage${RS}";
	echo -e "    ./build ${CTOKEN}{action}${RS} ${CTOKEN}{action}${RS} ${CTOKEN}{action}${RS} ...";
	echo -e "";
	echo -e "${CSECTION}Available actions${RS}";
	echo -e "    ${CACTION}setup${RS}    - Perform initial setup";
	echo -e "    ${CACTION}build${RS}    - Build the static site";
	echo -e "    ${CACTION}watch${RS}    - Watch for changes and rebuild automatically";
	echo -e "    ${CACTION}server${RS}   - Start a development busybox http server";
	echo -e "    ${CACTION}launch${RS}   - Do both ${CACTION}server${RS} and ${CACTION}watch${RS}";
	echo -e "    ${CACTION}serve${RS}    - Start a livereload server";
	echo -e "";
	
	exit 1;
fi

###############################################################################

task_setup() {
	task_begin "Checking environment";
	check_command git true;
	check_command node true;
	check_command npm true;
	check_command npx true;
	task_end 0;
	
	task_begin "Initialising submodules";
	execute git submodule update --init;
	task_end $?;
	
	task_begin "Installing dependencies";
	npm install;
	task_end "$?";
}

task_build() {
	task_begin "Building site";
	cd src || { echo "Failed to cd into src"; exit 1; };
	execute npx @11ty/eleventy --config="${config}" --output="${output_dir}";
	task_end "$?";
}
task_watch() {
	echo -e "Watching for changes.";
	while :; do # : = infinite loop
		# Wait for an update
		# inotifywait's non-0 exit code forces an exit for some reason :-/
		inotifywait -qr --event modify --event close_write --format '%:e %f' src;
		
		# Rebuild the client code - spawn a sub-process to avoid the hard exit
		# This still doesn't work though, which is *really* annoying
		stage_begin "Rebuilding";
		set +e; # Allow errors
		./build build;
		set -e;
		stage_end 0;
	done
}

task_server() {
	task_begin "Starting server";
	busybox httpd -vv -f -p "${port_number}" -h "${output_dir}" &
	pid="$!"
	task_end "$?";
	echo -e "Server started on ${HC}http://$(hostname -I | tr ' ' '\n' | head -n1):${port_number}/${RS}"
	
	on_exit() {
		task_begin "Stopping server";
		kill "${pid}";
		task_end "$?";
	}
	trap on_exit EXIT;
	
	wait
}

task_launch() {
	tasks_run server &
	tasks_run watch &
	wait
}

task_serve() {
	tasks_run watch &
	sleep 0.2;
	task_begin "Building site";
	cd src || { echo "Failed to cd into src"; exit 1; };
	execute npx @11ty/eleventy --config="${config}" --serve --output "${output_dir}";
	task_end "$?";
}

###############################################################################

tasks_run "$@";
