#!/bin/bash

CONFIG_PATH="/etc/modalai/voxl-static-ip-watcher.conf"

# Function to create default config
create_default_config() {
    sudo mkdir -p "$(dirname "$CONFIG_PATH")"
    sudo tee "$CONFIG_PATH" > /dev/null <<EOF
{
  "debug": 0,
  "interfaces": [
    {
      "network_interface": "auto",
      "static_ip": "10.0.0.2",
      "netmask": "255.255.255.0"
    }
  ]
}
EOF
    echo "Default config created at $CONFIG_PATH"
    exit 0
}

# Function to read values from JSON config
load_config() {
    if [[ -f "$CONFIG_PATH" ]]; then
        DEBUG=$(jq -r '.debug // "0"' "$CONFIG_PATH")

        # Check if new multi-interface format exists
        if jq -e '.interfaces' "$CONFIG_PATH" >/dev/null 2>&1; then
            INTERFACE_COUNT=$(jq '.interfaces | length' "$CONFIG_PATH")
        else
            # Backward compatibility: convert old single-interface format to array
            INTERFACE_COUNT=1
        fi
    else
        echo "Config file not found at $CONFIG_PATH. Using environment/defaults."
        DEBUG="${DEBUG:-0}"
        INTERFACE_COUNT=1
    fi
}

# Get interface config by index (0-based)
get_interface_config() {
    local idx=$1
    if [[ -f "$CONFIG_PATH" ]] && jq -e '.interfaces' "$CONFIG_PATH" >/dev/null 2>&1; then
        # New multi-interface format
        jq -r ".interfaces[$idx].network_interface // \"auto\"" "$CONFIG_PATH"
        jq -r ".interfaces[$idx].static_ip // \"10.0.0.2\"" "$CONFIG_PATH"
        jq -r ".interfaces[$idx].netmask // \"255.255.255.0\"" "$CONFIG_PATH"
    elif [[ -f "$CONFIG_PATH" ]]; then
        # Old single-interface format (backward compatibility)
        jq -r '.network_interface // "auto"' "$CONFIG_PATH"
        jq -r '.static_ip // "10.0.0.2"' "$CONFIG_PATH"
        jq -r '.netmask // "255.255.255.0"' "$CONFIG_PATH"
    else
        # Defaults
        echo "auto"
        echo "10.0.0.2"
        echo "255.255.255.0"
    fi
}

# Handle command-line args
while getopts "c" opt; do
    case $opt in
        c)
            create_default_config
            ;;
        *)
            echo "Usage: $0 [-c]" >&2
            exit 1
            ;;
    esac
done

# Ensure jq is installed
if ! command -v jq >/dev/null 2>&1; then
    echo "jq is required but not found. Please install jq." >&2
    exit 1
fi

echo "[INFO] Loading config"
load_config

log() {
    if [[ -n "$DEBUG" && "$DEBUG" != "0" ]]; then
        echo "$(date +'%F %T') [static-ip-watcher] $*"
    fi
}

# Set static IP for a single interface
# Args: $1=network_interface, $2=static_ip, $3=netmask
set_static_ip() {
    local NETWORK_INTERFACE="$1"
    local STATIC_IP="$2"
    local NETMASK="$3"

    log "Processing interface: $NETWORK_INTERFACE, IP: $STATIC_IP, Netmask: $NETMASK"

    # --- Auto-select non-Doodle ethX when NETWORK_INTERFACE=auto ---
    if [[ "$NETWORK_INTERFACE" == "auto" ]]; then
        echo "[INFO] Autodetecting interface..."

        # Try to find the interface that uses the smsc95xx driver (Doodle)
        DOODLE_INTERFACE=$(for iface in $(ls /sys/class/net); do
            driver=$(ethtool -i "$iface" 2>/dev/null | awk '/driver:/ {print $2}')
            if [ "$driver" = "smsc95xx" ]; then
                echo "$iface"
                break
            fi
        done)

        # Pick the first ethX that is NOT the Doodle interface
        for cand in $(ls /sys/class/net | grep -E '^(eth[0-9]+|enx[0-9a-zA-Z]+)$'); do
            if [[ "$cand" != "$DOODLE_INTERFACE" ]]; then
                NETWORK_INTERFACE="$cand"
                echo "[INFO] Using auto detected interface: $NETWORK_INTERFACE"
                break
            else
                echo "[INFO] Skipping Doodle interface..."
            fi
        done

        # Fallback if none found
        [[ "$NETWORK_INTERFACE" == "auto" || -z "$NETWORK_INTERFACE" ]] && NETWORK_INTERFACE="eth0"
    fi

    if /sbin/ip link show dev "$NETWORK_INTERFACE" >/dev/null 2>&1; then
        log "$NETWORK_INTERFACE present"

        if /sbin/ip link show "$NETWORK_INTERFACE" | grep -q "state UP"; then
            log "$NETWORK_INTERFACE state up"

            if ! /sbin/ip addr show "$NETWORK_INTERFACE" | grep -q "$STATIC_IP"; then
                log "Assigning $STATIC_IP to $NETWORK_INTERFACE"
                /sbin/ifconfig "$NETWORK_INTERFACE" "$STATIC_IP" netmask "$NETMASK" up
            else
                log "$NETWORK_INTERFACE IP already set"
            fi

            # Idempotent default route setup (avoid SIOCADDRT: File exists)
            if ! /sbin/ip route show default | grep -q "via $STATIC_IP dev $NETWORK_INTERFACE"; then
                log "Setting default route via $STATIC_IP on $NETWORK_INTERFACE"
                /sbin/ip route replace default via "$STATIC_IP" dev "$NETWORK_INTERFACE"
            else
                log "Default route already set via $STATIC_IP on $NETWORK_INTERFACE"
            fi
        else
            log "$NETWORK_INTERFACE state down, bringing it up."
            /sbin/ifconfig "$NETWORK_INTERFACE" up
        fi
    else
        log "$NETWORK_INTERFACE not present"
    fi
}

# Process all configured interfaces
process_all_interfaces() {
    for ((i=0; i<INTERFACE_COUNT; i++)); do
        # Read config for this interface (3 lines: interface, ip, netmask)
        local config
        config=$(get_interface_config "$i")
        local iface=$(echo "$config" | sed -n '1p')
        local ip=$(echo "$config" | sed -n '2p')
        local mask=$(echo "$config" | sed -n '3p')
        set_static_ip "$iface" "$ip" "$mask"
    done
}

echo "[INFO] Monitoring $INTERFACE_COUNT interface(s)"

while true; do
    sleep 5
    process_all_interfaces
done
