#!/bin/bash

INTERVAL=10
CELL_MGMT=cell_mgmt
MAX_SLOT_NUM=0
USED_SLOT_NUM=0
SIGNAL_FROM_SLOTS=()

# profile
CONF_DIR=/etc/moxa-cellular-utils
PRODUCT_DIR=${CONF_DIR}/product.d

KVERSION=$(which kversion)
[ -z "${KVERSION}" ] && >&2 echo "Error: \`kversion\` not found." && exit 1

PRODUCT="$(${KVERSION} 2> /dev/null | awk '{print $1}')"

_calc_max_slot_num() {
	for conf in $(ls ${PRODUCT_DIR}); do
		if [ "${conf: -5}" = ".conf" ]; then
			. "${PRODUCT_DIR}/$conf"
		fi
	done

	eval "_product_${PRODUCT}_profile" 2>/dev/null
	if [ "$?" != "0" ]; then
		>&2 echo "Error: \`kversion\` or profile not found."
		_exit 1
	fi

	MAX_SLOT_NUM=${#MODULE_PATH[@]}
}

_init_signal_from_slots() {
	for (( i=0; i<${MAX_SLOT_NUM}; i++ )); do
		# set to 999 for slot unused
		SIGNAL_FROM_SLOTS[i]=999

		# turn off all slots leds
		_signal_level_to_led "$((i+1))"
	done
	USED_SLOT_NUM=0
}

_calc_used_slot_num() {
	local count=0

	for (( i=0; i<${MAX_SLOT_NUM}; i++ )); do
		if [ "${SIGNAL_FROM_SLOTS[i]}" != "0" ] && [ "${SIGNAL_FROM_SLOTS[i]}" != "999" ]; then
			count=$((count+1))
		fi
	done
	USED_SLOT_NUM=${count}
}

_signal_level_to_led() {
	local slot=$1
	local signal=${2:-"0"}
	local o_ifs=""

	# Compare the signal with the threshold level and then invoke
	# the product specific led representaion function.
	# Do nothing if no function defined.
	case ${signal} in
	1)
		signal_func_name="SIGNAL_LED_POOR"
		;;
	2|3)
		signal_func_name="SIGNAL_LED_FAIR"
		;;
	4|5)
		signal_func_name="SIGNAL_LED_EXCELLENT"
		;;
	*)
		signal_func_name="SIGNAL_LED_FLUSH"
		;;
	esac

	[ -z "${!signal_func_name}" ] && return 0

	signal_led_funcs="$(echo "${!signal_func_name}" | \
		sed -e "s/\$SLOT/$slot/g")"

	o_ifs="${IFS}"
	IFS=$'\n'
	for i in $signal_led_funcs; do
		eval "$i"
	done
	IFS="${o_ifs}"
}

_loop() {
	while [ 1 ]; do
		modules=$(${CELL_MGMT} modules) || modules=0

		# when module uninstall from slot, turn off all leds,
		# then turn on still installed modules' leds
		_calc_used_slot_num
		if [ ${modules} -lt ${USED_SLOT_NUM} ]; then
			_init_signal_from_slots
		fi
		for i in $(seq 0 $((modules-1))); do
			slot=$(${CELL_MGMT} -i $i slot)
			# Format:
			# <RAT> Level: <level> (description)
			signal=$(${CELL_MGMT} -i $i signal |  cut -d ' ' -f 3)
			_signal_level_to_led "${slot}" "${signal}"

			# record signal in $SIGNAL_FROM_SLOTS
			SIGNAL_FROM_SLOTS[$((slot-1))]=${signal}
		done

		sleep ${INTERVAL}
	done
}

usage() {
	echo "Usage:"
	echo "  $1 [OPTION]"
	echo ""
	echo "Options:"
	echo "  -i <polling interval>"
	echo "		Polling interval in seconds to update the signal LED"
	echo "  -h"
	echo "		Show help"
	echo "  -v"
	echo "		Print version"
}


while getopts  "i:vh" flag; do
	if [ "${flag}" = "i" ]; then
		re='^[0-9]+$'
		if ! [[ $OPTARG =~ $re ]] ; then
			   echo "error: Interval should be a number" >&2
			   usage $0
			   exit 1
		fi
		INTERVAL=$OPTARG
	elif [ "${flag}" = "h" ]; then
		usage $0
		exit 0
	elif [ "${flag}" = "v" ]; then
		${CELL_MGMT} version
		exit 0
	fi
done

_calc_max_slot_num
_init_signal_from_slots
_loop
