#!/bin/bash
set -euo pipefail

KIND="${1:?kind: eth|wifi}"
IFACE="${2:?interface}"
METHOD="${3:?method: auto|manual}"

log() { echo "[nivato-network] $*"; }
warn() { echo "[nivato-network] UWAGA: $*" >&2; }

if [ "$KIND" != "eth" ] && [ "$KIND" != "wifi" ]; then
    warn "Nieprawidłowy typ interfejsu: $KIND"
    exit 2
fi

if [ "$METHOD" != "auto" ] && [ "$METHOD" != "manual" ]; then
    warn "Nieprawidłowy tryb adresowania: $METHOD"
    exit 2
fi

find_connection() {
    local conn
    conn=$(nmcli -g GENERAL.CONNECTION device show "$IFACE" 2>/dev/null || true)
    if [ -n "$conn" ] && [ "$conn" != "--" ]; then
        if [ "$KIND" != "wifi" ] || [ "$conn" != "Hotspot" ]; then
            echo "$conn"
            return 0
        fi
    fi

    local nm_type="802-3-ethernet"
    if [ "$KIND" = "wifi" ]; then
        nm_type="802-11-wireless"
    fi

    while IFS= read -r name; do
        [ -z "$name" ] && continue
        [ "$KIND" = "wifi" ] && [ "$name" = "Hotspot" ] && continue

        local iface
        iface=$(nmcli -g connection.interface-name con show "$name" 2>/dev/null || true)
        if [ "$iface" = "$IFACE" ]; then
            echo "$name"
            return 0
        fi
    done < <(nmcli -t -f NAME,TYPE con show 2>/dev/null | awk -F: -v type="$nm_type" '$2==type {print $1}')

    if [ "$KIND" = "wifi" ]; then
        warn "Nie znaleziono profilu WiFi dla $IFACE. Najpierw połącz z siecią WiFi."
        return 1
    fi

    local new_conn="${IFACE}-config"
    log "Tworzę nowe połączenie: $new_conn"
    nmcli con add type ethernet ifname "$IFACE" con-name "$new_conn" ipv4.method auto 2>/dev/null || true
    echo "$new_conn"
}

CONN=$(find_connection)
log "Konfiguracja połączenia: $CONN ($IFACE)"

if [ "$METHOD" = "auto" ]; then
    nmcli con modify "$CONN" \
        ipv4.method auto \
        ipv4.addresses "" \
        ipv4.gateway "" \
        ipv4.dns ""
    log "Ustawiono DHCP"
else
    ADDRESS="${4:?adres/prefiks dla trybu manual}"
    GATEWAY="${5:-}"
    DNS="${6:-}"
    nmcli con modify "$CONN" \
        ipv4.method manual \
        ipv4.addresses "$ADDRESS" \
        ipv4.gateway "$GATEWAY" \
        ipv4.dns "$DNS"
    log "Ustawiono statyczne IP: $ADDRESS gw=$GATEWAY dns=$DNS"
fi

nmcli con up "$CONN" 2>/dev/null || nmcli con up ifname "$IFACE" 2>/dev/null || \
    warn "Nie udało się aktywować połączenia (może wymagać ponownego podłączenia)"

log "Gotowe."
