#!/bin/bash
# Copyright (C) MOXA Inc. All rights reserved.
# Authors:
#     2024  Wilson YS Huang  <wilsonys.huang@moxa.com>
# This software is distributed under the terms of the MOXA SOFTWARE NOTICE.
# See the file LICENSE for details.
#

MCU_MGMT="/usr/sbin/mx-mcu-mgmt"

usage() {
    cat <<EOF
Usage:
        mx-lanbypass-ctl [Options]...

Options:
        -r, --relaymode
                Get relay mode (0:connect|1:disconnect|2:by-pass)
        -r, --relaymode [0|1|2]
                Set relay mode (0:connect|1:disconnect|2:by-pass)
        -m, --wdtrelaymode
                Get wdt relay mode (0:connect|1:disconnect|2:by-pass)
        -m, --wdtrelaymode [0|1|2]
                Set wdt relay mode (0:connect|1:disconnect|2:by-pass)
        -p, --pwroffrelaymode
                Get power off (S5) relay mode (1:disconnect|2:by-pass)
        -p, --pwroffrelaymode [1|2]
                Set power off (S5) relay mode (1:disconnect|2:by-pass)

EOF
}

handle_relay_option() {
    local mode

    if [ -n "$2" ]; then
        case "$2" in
        0) mode="connect" ;;
        1) mode="disconnect" ;;
        2) mode="bypass" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        $MCU_MGMT relay set_mode "$mode"
        echo "Set Relay Mode: $2"
    else
        case "$($MCU_MGMT relay get_mode)" in
        connect) mode="0" ;;
        disconnect) mode="1" ;;
        bypass) mode="2" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        echo "Get Relay Mode: $mode"
    fi
}

handle_wdt_reset_option() {
    local mode

    if [ -n "$2" ]; then
        case "$2" in
        0) mode="off" ;;
        1) mode="on" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        $MCU_MGMT wdt_reset set_mode "$mode"
        echo "Set Watchdog Reset Mode: $2"
    else
        case "$($MCU_MGMT wdt_reset get_mode)" in
        off) mode="0" ;;
        on) mode="1" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        echo "Get Watchdog Reset Mode: $mode"
    fi
}

handle_wdt_relay_option() {
    local mode

    if [ -n "$2" ]; then
        case "$2" in
        0) mode="connect" ;;
        1) mode="disconnect" ;;
        2) mode="bypass" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        $MCU_MGMT wdt_relay set_mode "$mode"
        echo "Set Watchdog Relay Mode: $2"
    else
        case "$($MCU_MGMT wdt_relay get_mode)" in
        connect) mode="0" ;;
        disconnect) mode="1" ;;
        bypass) mode="2" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        echo "Get Watchdog Relay Mode: $mode"
    fi
}

handle_poweroff_relay_option() {
    local mode

    if [ -n "$2" ]; then
        case "$2" in
        1) mode="disconnect" ;;
        2) mode="bypass" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        $MCU_MGMT poweroff_relay set_mode "$mode"
        echo "Set Power Off (S5) Relay Mode: $2"
    else
        case "$($MCU_MGMT poweroff_relay get_mode)" in
        disconnect) mode="1" ;;
        bypass) mode="2" ;;
        *)
            echo "Invalid Mode"
            return
            ;;

        esac

        echo "Get Power Off (S5) Relay Mode: $mode"
    fi
}

main() {
    if [ ! -x "${MCU_MGMT}" ]; then
        echo "Error: mx-mcu-mgmt is not exist."
        exit 1
    fi

    if [ $# -eq 0 ]; then
        usage
        exit 1
    fi

    case "$1" in
    -r | --relaymode)
        handle_relay_option "$@"
        ;;
    -m | --wdtrelaymode)
        handle_wdt_relay_option "$@"
        ;;
    -p | --pwroffrelaymode)
        handle_poweroff_relay_option "$@"
        ;;
    -h | --help)
        usage
        exit 0
        ;;
    *)
        echo "Unknown option: $1"
        usage
        exit 1
        ;;
    esac
}

main $@
