#!/bin/bash
# Temporary USB mode switcher for PicoCalc
# Writes runtime overrides to /run/usb-gadget-network.env and restarts services.

set -e

OVERRIDE_FILE="/run/usb-gadget-network.env"
DEFAULT_FILE="/etc/default/usb-gadget-network"

USB_MODE=""
USB_PROTOCOL=""
ENABLE_SERIAL_CONSOLE=""
ENABLE_NETWORK=""
ENABLE_ADB=""

print_usage() {
    cat <<EOF
Usage: usb-modeswitch [options]

Options:
  --mode {gadget|host}          Switch between gadget and host mode
  --protocol {both|ecm|rndis}    USB network protocol(s) (gadget mode only)
  --serial {on|off}             Enable or disable USB serial console (ACM)
  --network {on|off}            Enable or disable USB networking function
  --adb {on|off}                Enable or disable ADB FunctionFS
  --clear                       Remove temporary overrides and restart services
  --status                      Show current effective settings
  -h, --help                    Show this help

Examples:
  usb-modeswitch --mode host
  usb-modeswitch --mode gadget --protocol rndis
  usb-modeswitch --serial on --network off
  usb-modeswitch --clear
EOF
}

normalize_onoff() {
    case "$1" in
        on|enable|enabled|1) echo "1" ;;
        off|disable|disabled|0) echo "0" ;;
        *) echo "" ;;
    esac
}

normalize_protocol() {
    case "$1" in
        both|dual|all) echo "both" ;;
        ecm|cdc|cdc-ether|cdc-ethernet) echo "ecm" ;;
        rndis) echo "rndis" ;;
        *) echo "" ;;
    esac
}

load_config() {
    if [ -f "${DEFAULT_FILE}" ]; then
        . "${DEFAULT_FILE}"
    fi
    if [ -f "${OVERRIDE_FILE}" ]; then
        . "${OVERRIDE_FILE}"
    fi

    USB_MODE=${USB_MODE:-gadget}
    USB_PROTOCOL=${USB_PROTOCOL:-rndis}
    ENABLE_SERIAL_CONSOLE=${ENABLE_SERIAL_CONSOLE:-0}
    ENABLE_NETWORK=${ENABLE_NETWORK:-1}
    ENABLE_ADB=${ENABLE_ADB:-0}
}

write_override() {
    cat > "${OVERRIDE_FILE}" <<EOF
# Auto-generated by usb-modeswitch (runtime only)
USB_MODE=${USB_MODE}
USB_PROTOCOL=${USB_PROTOCOL}
ENABLE_SERIAL_CONSOLE=${ENABLE_SERIAL_CONSOLE}
ENABLE_NETWORK=${ENABLE_NETWORK}
ENABLE_ADB=${ENABLE_ADB}
EOF
}

restart_services() {
    systemctl restart usb-gadget-network.service || true
    systemctl restart usb-gadget-serial-console.service || true
}

show_status() {
    load_config
    echo "USB_MODE=${USB_MODE}"
    echo "USB_PROTOCOL=${USB_PROTOCOL}"
    echo "ENABLE_SERIAL_CONSOLE=${ENABLE_SERIAL_CONSOLE}"
    echo "ENABLE_NETWORK=${ENABLE_NETWORK}"
    echo "ENABLE_ADB=${ENABLE_ADB}"
}

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

case "$1" in
    -h|--help)
        print_usage
        exit 0
        ;;
    --status)
        show_status
        exit 0
        ;;
    --clear)
        rm -f "${OVERRIDE_FILE}"
        restart_services
        exit 0
        ;;
esac

load_config

while [ $# -gt 0 ]; do
    case "$1" in
        --mode)
            shift
            case "$1" in
                gadget|host)
                    USB_MODE="$1"
                    ;;
                *)
                    echo "Error: invalid --mode '$1'"
                    exit 1
                    ;;
            esac
            ;;
        --protocol)
            shift
            USB_PROTOCOL=$(normalize_protocol "$1")
            if [ -z "${USB_PROTOCOL}" ]; then
                echo "Error: invalid --protocol '$1'"
                exit 1
            fi
            ;;
        --serial)
            shift
            ENABLE_SERIAL_CONSOLE=$(normalize_onoff "$1")
            if [ -z "${ENABLE_SERIAL_CONSOLE}" ]; then
                echo "Error: invalid --serial '$1'"
                exit 1
            fi
            ;;
        --network)
            shift
            ENABLE_NETWORK=$(normalize_onoff "$1")
            if [ -z "${ENABLE_NETWORK}" ]; then
                echo "Error: invalid --network '$1'"
                exit 1
            fi
            ;;
        --adb)
            shift
            ENABLE_ADB=$(normalize_onoff "$1")
            if [ -z "${ENABLE_ADB}" ]; then
                echo "Error: invalid --adb '$1'"
                exit 1
            fi
            ;;
        -h|--help)
            print_usage
            exit 0
            ;;
        --status)
            show_status
            exit 0
            ;;
        --clear)
            rm -f "${OVERRIDE_FILE}"
            restart_services
            exit 0
            ;;
        *)
            echo "Error: unknown option '$1'"
            print_usage
            exit 1
            ;;
    esac
    shift
 done

write_override
restart_services

exit 0
