#!/bin/bash
#

test -z $TTY && TTY="/dev/ttyUSB0"
test -z $IP && IP="192.168.4.20"
test -z $VER && VER="0.1.2"
BUILD="$(git rev-parse --short HEAD)-$(date '+%Y%m%d%H%M%S')"

ACLI="$HOME/.local/bin/arduino-cli"
ACLI_CMD="$ACLI --config-file arduino-cli.yml"
BOARD="esp8266:esp8266:d1_mini_clone"

function help() {
	echo "$0 [setup|build|upload|webupload|monitor]"
	echo "setup: setup build environment, download arduino-cli, install all dependencies for arduino ide"
	echo "build: build firmware binary. will be saved into build/"
	echo "upload: upload firmware by serial connection $TTY"
	echo "webupload: upload firmware with webupload to $IP"
	echo "monitor: serial monitor $TTY"
	exit 1
}

function check_acli() {
	if [ ! -x $ACLI ]
	then
		echo "$ACLI does not exist nor is executable. Please run '$0 setup' first"
		exit 1
	fi
}

test -z $1 && help

case $1 in
	s|setup)
		ACLI_DIR="$(dirname $ACLI)"
		declare -a LIBS=( "Adafruit SSD1306" "Adafruit BME280 Library" "ArduinoJson" "NTPClient" "Time" "Adafruit SHT31 Library" )
		echo ":: Setting up build environment for CanGrow Firmware."
		echo "   This will download the binary for arduino-cli and install"
		echo "   the packages for the arduino ide from the debian repository."
		echo "   !! This script is meant to be executed on a Debian stable (bookworm) system !!"
		echo ""
		echo ":: Press Enter to continue"
		read
		echo ""
		echo ":: Installing Arduino IDE packages with apt, please enter sudo password:"
		sudo apt update 
		sudo apt install arduino python3 wget curl xxd
		echo ":: Ensure directory ${ACLI_DIR} is present"
		test -d ${ACLI_DIR} || mkdir -p ${ACLI_DIR}
		echo ":: Please ensure ${ACLI_DIR} is in your \$PATH, I wont do it."
		echo ""
		echo ":: Downloading arduino-cli 1.0.0 into ${ACLI_DIR}/"
		wget -O - "https://github.com/arduino/arduino-cli/releases/download/v1.0.0/arduino-cli_1.0.0_Linux_64bit.tar.gz" | tar -C ${ACLI_DIR} -zxvf - arduino-cli 
		chmod +x ${ACLI}
		echo ""
		echo ":: Installing ESP8266 core for Arduino"
		${ACLI_CMD} core install esp8266:esp8266
		echo ":: Installing Arduino libraries"
		for lib in ${!LIBS[@]}
		do
			echo "     - ${LIBS[$lib]}"
		done
		
		for lib in ${!LIBS[@]}
		do
			${ACLI_CMD} lib install "${LIBS[$lib]}"
		done
		echo ""
		echo ":: Setup build environment done! You can now build the firmware"
		echo "   with: $0 build"

		;;
	b|build)
		check_acli
		echo ":: Building firmware $VER $BUILD, target dir: $(pwd)/build/"
		test -d build || mkdir build
		${ACLI_CMD} --no-color compile -b ${BOARD}  "Arduino/CanGrow/CanGrow.ino" --build-property "build.extra_flags=-DCANGROW_VER=\"${VER}\" -DCANGROW_BUILD=\"${BUILD}\"" --output-dir build/ || exit 1
		cp build/CanGrow.ino.bin build/CanGrow_v${VER}_${BUILD}.bin
		;;
	u|upload)
		check_acli
		echo ":: Uploading to $TTY"
		${ACLI_CMD} --no-color compile -v  -b ${BOARD} -u -p $TTY  "Arduino/CanGrow/CanGrow.ino"
		;;
	w|webupload)
		echo ":: Uploading to $IP"
		curl -v http://$IP/system/applyUpdate -X POST -H 'Content-Type: multipart/form-data' -F "firmware=@$(pwd)/build/CanGrow.ino.bin"
		echo
		;;	
	m|mon|monitor)
		check_acli
		echo ":: Open serial monitor $TTY"
		${ACLI_CMD} monitor -c baudrate=115200 -b ${BOARD} -p $TTY
		;;
	*)
		help
		;;
esac