#!/bin/bash -

# Copyright (C) MOXA Inc. All rights reserved.
# This software is distributed under the terms of the MOXA SOFTWARE NOTICE.
# See the file MOXA-SOFTWARE-NOTICE for details.
#
# Name:
#	MOXA Bootloader Mode Utility
#
# Description:
#	Set/Get MOXA Bootloader Mode (Production mode/Developer mode)
#
# Copyright (C) Moxa, Inc. All rights reserved.
# Copyright (C) 2022	Henry LC Chen	<HenryLC.Chen@moxa.com>

BASENAME="mx-bootloader-mode-tool"
INTERFACE_NAME="mx-bootloader-mgmt mode"
ENV_FLAG="prod_mode"

_logger() {
	echo "$1"
	logger -i -t $BASENAME "$1"
}

usage() {
	echo "Set/Get Moxa Bootloader Mode (Production/Developer)"
	echo
	echo "USAGE:"
	echo "    $INTERFACE_NAME [SUBCOMMAND]"
	echo
	echo "FLAGS:"
	echo "    -h, --help                Display the help menu"
	echo
	echo "SUBCOMMANDS:"
	echo "    info                      Get the current mode of bootloader"
	echo "    production                Set bootloader to Production mode"
	echo "    developer                 Set bootloader to Developer mode"
	echo
}

_set_env(){
	fw_setenv $ENV_FLAG "$1"
}

_get_env(){
	local mode_info
	mode_info=$(fw_printenv -n ${ENV_FLAG})
	echo "${mode_info}"
}

_get_secure_boot(){
    local secure_boot
    secure_boot=$(mx-interface-mgmt deviceinfo | sed -n '/SECUREBOOT/s/[^=]*=//p')
    echo "${secure_boot}"
}

info() {
	if [ "$(_get_env)" = "1" ]; then
		_logger "Current mode: production"
	elif [ "$(_get_env)" = "0" ]; then
		_logger "Current mode: developer"
	else
		_logger "Current mode: unknown"
	fi
}

set_production(){
	if [ "$(_get_secure_boot)" = "Disabled" ]; then
		_logger "Not allowed to switch modes on Standard Model"
        exit 1
	fi
	_set_env 1
	_logger "Set mode successfully"
	info
}

set_developer(){
	if [ "$(_get_secure_boot)" = "Disabled" ]; then
		_logger "Not allowed to switch modes on Standard Model"
        exit 1
	fi
	_set_env 0
	_logger "Set mode successfully"
	info
}

parsing_options() {
	while [ -n "$1" ]; do
		case "$1" in
		-i | --info | info)
			action=info
			shift
			;;
		-p | --production | production)
			action=production
			shift
			;;
		-d | --developer | developer)
			action=developer
			shift
			;;
		-h | --help | help)
			usage
			exit 0
			;;
		*)
			usage
			exit 1
		esac
	done

	if [ -z "$action" ]; then
		return 1
	fi

	return 0
}

main() {
	if ! parsing_options "$@"; then
		usage
		exit 1
	fi

	case "$action" in
	info)
		info
		;;
	production)
		set_production
		;;
	developer)
		set_developer
		;;
	*)
		;;
	esac

	return 0
}

main "$@"
