#!/bin/bash
################################################################################
# Copyright 2024 ModalAI Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# 4. The Software is used solely in conjunction with devices provided by
#    ModalAI Inc.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
################################################################################

NAME="voxl-lepton-server"
SERVICE_FILE="${NAME}.service"
CONFIG_FILE="/etc/modalai/${NAME}.conf"
USER=$(whoami)


print_usage () {
	echo ""
	echo "Usage:"
	echo "voxl-configure-lepton {MODE}"
	echo ""
	echo "Valid Modes are:"
	echo ""
	echo "disable               disable the service"
	echo "VOXL2_J10             configure for SPI-only connection on VOXL2 J10"
	echo "m0130                 configure for SPI+I2C connection on M0130 (VOXL2 only)"
	echo "m0130_flow            M0130 on VOXL2 with flow shutter mode"
	echo "m0130_manual          M0130 on VOXL2 with manual shutter mode"
	echo "m0173                 configure for SPI+I2C connection on M0173"
	echo "m0173_manual          like above but with manual shutter"
	echo "m0173_rotated         like above but rotated image for Starling 2"
	echo "m0173_rotated_manual  like above but with manual shutter"
	echo "m0188                configure for I2C connection on M0188"
	echo "enable                enable the service, leave config file alone"
	echo ""
	echo ""
	echo "show this help message:"
	echo "voxl-configure-lepton help"
	echo ""
	exit 0
}


## set most parameters which don't have quotes in json
set_param () {
	if [ "$#" != "2" ]; then
		echo "set_param expected 2 args"
		exit 1
	fi

	# remove quotes if they exist
	var=$1
	var="${var%\"}"
	var="${var#\"}"
	val=$2
	val="${val%\"}"
	val="${val#\"}"

	sed -E -i "/\"$var\":/c\	\"$var\":	$val," ${CONFIG_FILE}
}

set_param_last () {
	if [ "$#" != "2" ]; then
		echo "set_param expected 2 args"
		exit 1
	fi

	# remove quotes if they exist
	var=$1
	var="${var%\"}"
	var="${var#\"}"
	val=$2
	val="${val%\"}"
	val="${val#\"}"

	sed -E -i "/\"$var\":/c\	\"$var\":	$val" ${CONFIG_FILE}
}

## set string parameters which need quotes in json
set_param_string () {
	if [ "$#" != "2" ]; then
		echo "set_param_string expected 2 args"
		exit 1
	fi
	var=$1
	var="${var%\"}"
	var="${var#\"}"
	sed -E -i "/\"$var\":/c\	\"$var\":	\"$2\"," ${CONFIG_FILE}
}


disable_service_and_exit () {
	echo "disabling ${NAME} systemd service"
	systemctl disable ${SERVICE_FILE}
	echo "stopping ${NAME} systemd service"
	systemctl stop ${SERVICE_FILE}
	echo "Done configuring ${NAME}"
	exit 0
}

enable_service_and_exit () {
	echo "enabling  ${NAME} systemd service"
	systemctl enable  ${SERVICE_FILE}
	echo "Done configuring ${NAME}"
	echo "Service will start on next reboot"
	exit 0
}

reset_config_file_to_default () {
	echo "wiping old config file"
	rm -rf ${CONFIG_FILE}
	${NAME} -c
}


################################################################################
## actual start of execution, handle optional arguments first
################################################################################

## sanity checks
if [ "${USER}" != "root" ]; then
	echo "Please run this script as root"
	exit 1
fi

## convert argument to lower case for robustness
arg=$(echo "$1" | tr '[:upper:]' '[:lower:]')

## parse arguments
case ${arg} in
	"")
		print_usage
		exit 0
		;;

	"h"|"-h"|"help"|"--help")
		print_usage
		exit 0
		;;

	"disable")
		disable_service_and_exit
		;;

	"VOXL2_J10"|"factory_enable")
		echo "configuring defaults"
		reset_config_file_to_default
		enable_service_and_exit
		;;

	"m0141"|"M0141"|"factory_enable_m0141")
		echo "configuring for VOXL2 with M0141"
		echo "note this requires a system image newer than Dec 1, 2023"
		reset_config_file_to_default
		set_param spi_bus 14
		set_param i2c_bus 1
		set_param en_i2c true
		enable_service_and_exit
		;;

	"m0130"|"M0130"|"m130"|"factory_enable_m0130")
		echo "configuring for VOXL2 with M0130"
		reset_config_file_to_default
		set_param spi_bus 11
		set_param i2c_bus 0
		set_param en_i2c true
		enable_service_and_exit
		;;

	"m0130_flow"|"M130_flow"|"factory_enable_m0130_flow")
		echo "configuring for VOXL2 with M0130 and flow mode"
		reset_config_file_to_default
		set_param spi_bus 11
		set_param i2c_bus 0
		set_param en_i2c true
		set_param_string shutter_mode flow
		enable_service_and_exit
		;;

	"m0130_manual"|"m130_manual"|"factory_enable_m0130_manual")
		echo "configuring for VOXL2 with M0130 and manual mode"
		reset_config_file_to_default
		set_param spi_bus 11
		set_param i2c_bus 0
		set_param en_i2c true
		set_param_string shutter_mode manual
		enable_service_and_exit
		;;

	"m0173"|"M0173"|"m173"|"factory_enable_m0173")
		echo "configuring for VOXL2 with M0173"
		reset_config_file_to_default
		set_param spi_bus 0
		set_param i2c_bus 4
		set_param en_i2c true
		enable_service_and_exit
		;;
	
	"m0173_manual")
		echo "configuring for VOXL2 with M0173"
		reset_config_file_to_default
		set_param spi_bus 0
		set_param i2c_bus 4
		set_param en_i2c true
		set_param_string shutter_mode manual
		enable_service_and_exit
		;;

	"m0173_rotated"|"M0173_rotated"|"m173_rotated"|"factory_enable_m0173_rotated")
		echo "configuring for VOXL2 with M0173"
		reset_config_file_to_default
		set_param spi_bus 0
		set_param i2c_bus 4
		set_param en_i2c true
		set_param_last en_rotate true
		enable_service_and_exit
		;;
	
	"m0173_rotated_manual"|"M0173_rotated_manual"|"m173_rotated_manual"|"factory_enable_m0173_rotated_manual")
		echo "configuring for VOXL2 with M0173"
		reset_config_file_to_default
		set_param spi_bus 0
		set_param i2c_bus 4
		set_param en_i2c true
		set_param_string shutter_mode manual
		set_param_last en_rotate true
		enable_service_and_exit
		;;

	"m0188"|"M0188"|"m188"|"factory_enable_m0188")
		echo "configuring for VOXL2 Mini with M0188"
		reset_config_file_to_default
		set_param spi_bus 0
		set_param i2c_bus 0
		set_param en_i2c true
		set_param_string shutter_mode manual
		set_param_last en_rotate true
		enable_service_and_exit
		;;

	"enable")
		enable_service_and_exit
		;;
	*)
		echo "invalid option"
		print_usage
		exit 1
esac



################################################################################
## no option given, print help
################################################################################
print_usage


