#!/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
{
  "network_interface": "auto",
  "static_ip": "10.0.0.2",
  "netmask": "255.255.255.0",
  "debug": 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
        NETWORK_INTERFACE=$(jq -r '.network_interface // "auto"' "$CONFIG_PATH")
        STATIC_IP=$(jq -r '.static_ip // "10.0.0.2"' "$CONFIG_PATH")
        NETMASK=$(jq -r '.netmask // "255.255.255.0"' "$CONFIG_PATH")
        DEBUG=$(jq -r '.debug // "0"' "$CONFIG_PATH")
    else
        echo "Config file not found at $CONFIG_PATH. Using environment/defaults."
        NETWORK_INTERFACE="${NETWORK_INTERFACE:-auto}"
        STATIC_IP="${STATIC_IP:-10.0.0.2}"
        NETMASK="${NETMASK:-255.255.255.0}"
        DEBUG="${DEBUG:-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
}

log "Watching interface:  $NETWORK_INTERFACE"
log "Static IP to assign: $STATIC_IP"
log "Netmask to use:      $NETMASK"

set_static_ip() {

    # --- 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]+$'); 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"
        fi
    else
        log "$NETWORK_INTERFACE not present"
    fi
}

while true; do
    sleep 5
    set_static_ip
done
