#!/bin/bash
# /usr/sbin/mx-pwr-mgmt — legacy compatibility wrapper
# Translates legacy mx-pwr-mgmt commands to mx-power-mgmt equivalents.
# All commands are deprecated; a warning is emitted to stderr on every call.

SELF="$(readlink -f "${BASH_SOURCE[0]}")"
BACKEND="$(dirname "$SELF")/mx-power-mgmt"
[ -x "$BACKEND" ] || BACKEND="mx-power-mgmt"

warn() { echo "WARNING: $*" >&2; }

cmd="$1"; shift

# Model check — this wrapper only supports UC-3400A.
# Skip for help/version which need no hardware access.
case "$cmd" in
    -h|--help|-v|--version|"") ;;
    *)
        _model_series=$(mx-ver -s 2>/dev/null)
        if [ "$_model_series" != "UC-3400A" ]; then
            echo "ERROR: mx-pwr-mgmt is not supported on this model" >&2
            exit 1
        fi
        ;;
esac

case "$cmd" in
    info)
        case "$1" in
            -h|--help)
                warn "'mx-pwr-mgmt info' is deprecated and will be removed in a future release. Use: mx-power-mgmt system show"
                cat <<'EOF'

Usage:
  mx-pwr-mgmt info

Available Commands:
  Show current power mode.
    $ mx-pwr-mgmt info
EOF
                exit 0
                ;;
        esac
        warn "'mx-pwr-mgmt info' is deprecated and will be removed in a future release. Use: mx-power-mgmt system show"

        sys_json=$("$BACKEND" system show -J 2>/dev/null) || {
            echo "ERROR: failed to get system status" >&2; exit 1
        }

        mode=$(echo "$sys_json" | jq -r '.data.powerMode')
        mode_cap="$(echo "${mode:0:1}" | tr '[:lower:]' '[:upper:]')${mode:1}"
        supported=$(echo "$sys_json" | jq -r \
            '[.data.supportedModes[] | (.[0:1] | ascii_upcase) + .[1:]] | join(" ")')

        cpu_json=$("$BACKEND" cpu list -J 2>/dev/null)
        cpu_freq_khz=$(echo "$cpu_json" | jq -r '(.data[0].currentFrequency.value * 1000 | tostring)')
        cpu_gov=$(echo "$cpu_json" | jq -r '.data[0].governor')

        # Parse disable= line for a given mode section from model conf
        CONF="/etc/moxa/moxa-power-manager/model.conf.d/UC-3400A.conf"
        parse_disable_line() {
            local mode_name="$1" in_sec=0 line
            [ -f "$CONF" ] || return
            local target="[system.mode.${mode_name}.peripheral]"
            while IFS= read -r line; do
                if [ "$line" = "$target" ]; then
                    in_sec=1
                elif [[ "$line" == \[*\] ]]; then
                    in_sec=0
                elif [ $in_sec -eq 1 ] && [[ "$line" == disable=* ]]; then
                    echo "${line#disable=}"
                    return
                fi
            done < "$CONF"
        }

        # Convert conf tokens to old-style peripheral display names
        # wifi:WiFi1 → WiFi1 | ethernet:LAN1,LAN2 → LAN1 LAN2 | usb → USB | led:X → LEDs
        tokens_to_names() {
            local result=""
            for token in $1; do
                local type="${token%%:*}"
                local arg="${token#*:}"; [ "$arg" = "$token" ] && arg=""
                case "$type" in
                    wifi)     result="$result ${arg:-WiFi1}" ;;
                    cellular) result="$result ${arg:-Cellular1}" ;;
                    ethernet) IFS=',' read -ra a <<< "$arg"
                              for n in "${a[@]}"; do result="$result $n"; done ;;
                    usb)      result="$result USB" ;;
                    sd)       result="$result SD" ;;
                    led)      result="$result LEDs" ;;
                esac
            done
            echo "${result# }"
        }

        # Extract LED device names from led:Name1,Name2 token
        get_led_names() {
            for token in $1; do
                case "$token" in led:*) echo "${token#led:}" | tr ',' ' '; return ;; esac
            done
        }

        cons_line=$(parse_disable_line conservation)
        stby_line=$(parse_disable_line standby)

        # Collect unique LED names across both modes
        all_led_names=""
        for n in $(get_led_names "$cons_line") $(get_led_names "$stby_line"); do
            echo "$all_led_names" | grep -qw "$n" || all_led_names="$all_led_names $n"
        done
        all_led_names="${all_led_names# }"

        # Output — matches old mpm_info() format exactly
        printf "Current Power Mode:\n  %s\n" "$mode_cap"
        printf "Current CPU Frequency:\n  %s\n" "$cpu_freq_khz"
        printf "Current Scaling Governor:\n  %s\n\n" "$cpu_gov"
        printf "Supported Power Mode:\n  %s\n\n" "${supported:-Active Conservation Standby}"
        [ -n "$cons_line" ] && \
            printf "Peripherals are turned off in Conservation mode:\n  %s \n" \
                   "$(tokens_to_names "$cons_line")"
        [ -n "$stby_line" ] && \
            printf "Peripherals are turned off in Standby mode:\n  %s \n" \
                   "$(tokens_to_names "$stby_line")"
        [ -n "$all_led_names" ] && \
            printf "LEDs are Turned off in Conservation or Standby modes:\n  %s \n" \
                   "$all_led_names"
        printf "\n"
        ;;

    set)
        case "$1" in
            -h|--help)
                warn "'mx-pwr-mgmt set' is deprecated and will be removed in a future release. Use: mx-power-mgmt system set-mode <mode>"
                cat <<'EOF'

Usage:
  mx-pwr-mgmt set

Available Commands:
  Affect system power-saving policies.
    $ mx-pwr-mgmt set --mode <active|conservation|standby>
  Set power to conservation mode and wake up from Timer.
    $ mx-pwr-mgmt set --mode conservation --second <second>
  Set power to standby mode and wake up from RTC.
    $ mx-pwr-mgmt set --mode standby --second <second>
EOF
                exit 0
                ;;
        esac

        mode=""; timer=""; dry_run=0

        while [ $# -gt 0 ]; do
            case "$1" in
                -m|--mode)    mode="$2";  shift 2 ;;
                -s|--second) timer="$2"; shift 2 ;;
                -n|--dry-run) dry_run=1;  shift   ;;
                -h|--help)
                    # -h after other options — ignore silently
                    shift ;;
                *) echo "ERROR: unknown option '$1'" >&2; exit 1 ;;
            esac
        done

        [ -z "$mode" ] && { echo "ERROR: -m/--mode is required" >&2; exit 1; }

        # [SECURITY] whitelist: reject unknown mode strings
        case "$mode" in
            active|conservation|standby) ;;
            *) echo "ERROR: invalid mode '$mode'" >&2; exit 1 ;;
        esac

        # [SECURITY] timer must be a non-negative integer
        if [ -n "$timer" ] && ! echo "$timer" | grep -qE '^[0-9]+$'; then
            echo "ERROR: invalid timer value '$timer'" >&2; exit 1
        fi

        translated=("$BACKEND" system set-mode "$mode")
        [ -n "$timer" ] && translated+=(--timer "$timer")

        warn "'mx-pwr-mgmt set --mode $mode${timer:+ --second $timer}' is deprecated and will be removed in a future release."
        echo "  Use: ${translated[*]}" >&2

        if [ "$dry_run" -eq 1 ]; then
            echo "[dry-run] Would execute: ${translated[*]}" >&2
            exit 0
        fi

        exec "${translated[@]}"
        ;;

    wakeupctl)
        case "$1" in
            -h|--help)
                warn "'mx-pwr-mgmt wakeupctl' is deprecated and will be removed in a future release. Use: mx-power-mgmt system show / set-wakeup-source"
                cat <<'EOF'

Usage:
  mx-pwr-mgmt wakeupctl

Available Commands:
  List all available wakeup sources.
    $ mx-pwr-mgmt wakeupctl
  Enable a wakeup source.
    $ mx-pwr-mgmt wakeupctl --enable <dev>
  Disable a wakeup source.
    $ mx-pwr-mgmt wakeupctl --disable <dev>
EOF
                exit 0
                ;;
            "")
                warn "'mx-pwr-mgmt wakeupctl' is deprecated and will be removed in a future release. Use: mx-power-mgmt system show"

                sys_json=$("$BACKEND" system show -J 2>/dev/null) || {
                    echo "ERROR: failed to get system status" >&2; exit 1
                }

                printf "NAME  STATE\n"
                while IFS=' ' read -r name enabled; do
                    # Filter out LAN sources not under MCIM control or disabled in MCIM
                    if [[ "$name" == LAN* ]]; then
                        mx-interface-mgmt ethernet "$name" > /dev/null 2>&1 || continue
                        io_state=$(mx-interface-mgmt ethernet "$name" 2>/dev/null \
                                   | awk -F'=' '/^IO_STATE=/ {print $2}')
                        [ "$io_state" = "enabled" ] || continue
                    fi
                    state=$([ "$enabled" = "true" ] && echo "enabled" || echo "disabled")
                    printf "%s  %s\n" "$name" "$state"
                done < <(echo "$sys_json" | jq -r \
                    '.data.wakeupSources[] | "\(.name) \(.enabled)"')
                ;;
            --enable|-e)
                dev="$2"
                [ -z "$dev" ] && { echo "ERROR: --enable requires a device name" >&2; exit 1; }
                warn "'mx-pwr-mgmt wakeupctl --enable $dev' is deprecated and will be removed in a future release."
                echo "  Use: mx-power-mgmt system set-wakeup-source $dev enable" >&2
                exec "$BACKEND" system set-wakeup-source "$dev" enable
                ;;
            --disable|-d)
                dev="$2"
                [ -z "$dev" ] && { echo "ERROR: --disable requires a device name" >&2; exit 1; }
                warn "'mx-pwr-mgmt wakeupctl --disable $dev' is deprecated and will be removed in a future release."
                echo "  Use: mx-power-mgmt system set-wakeup-source $dev disable" >&2

                # Replicate old anti-brick behaviour: warn to stdout then proceed
                sys_json=$("$BACKEND" system show -J 2>/dev/null)
                if [ $? -eq 0 ]; then
                    remaining=$(echo "$sys_json" | jq --arg d "$dev" \
                        '[.data.wakeupSources[] | select(.name != $d and .enabled == true)] | length')
                    has_timer=$(echo "$sys_json" | jq '.data.resumeTimer != null')
                    if [ "$remaining" -eq 0 ] && [ "$has_timer" = "false" ]; then
                        printf "Warning: No more wakeup devices exist\n"
                    fi
                fi

                exec "$BACKEND" system set-wakeup-source "$dev" disable --force
                ;;
            *)
                echo "ERROR: unknown wakeupctl option '$1'" >&2; exit 1 ;;
        esac
        ;;

    -v|--version)
        exec "$BACKEND" --version
        ;;

    -h|--help|"")
        warn "'mx-pwr-mgmt' is deprecated and will be removed in a future release. Use: mx-power-mgmt"
        cat <<'EOF'
MOXA Power Management Command-line Utility

Usage:
  mx-pwr-mgmt [command]

Available Commands:
  info         Show current power mode.
  set          Affect system performance and power usage.
  wakeupctl    Control the wakeup sources.
Flags:
 -n, --dry-run Does everything, but suspend.
 -h, --help    Display help for mx-pwr-mgmt.
 -v, --version Display version for mx-pwr-mgmt.
EOF
        exit 0
        ;;

    *)
        echo "ERROR: unknown command '$cmd'" >&2; exit 1 ;;
esac
