#!/bin/bash
#
# vpn-menu.sh (v4, RU/EN)
# Полное интерактивное управление SoftEther VPN Client с выбором языка.
#
# Использование:
#   sudo ./vpn-menu.sh                 # автоопределение языка по локали системы
#   sudo ./vpn-menu.sh --lang=ru       # принудительно русский
#   sudo ./vpn-menu.sh --lang=en       # принудительно английский
#   VPN_LANG=en sudo -E ./vpn-menu.sh  # через переменную окружения
#

set -euo pipefail

VPNCLIENT_MANUAL_DIR="/usr/local/vpnclient"
VPNCMD_BIN=""
VPNCLIENT_BIN=""
DHCP_TIMEOUT=15
SYSTEMD_SERVICE="softether-vpnclient"

# ============================================================
#  ВЫБОР ЯЗЫКА
# ============================================================

LANG_SCRIPT=""

# 1) аргумент командной строки --lang=en / --lang=ru
for arg in "$@"; do
    case "$arg" in
        --lang=ru) LANG_SCRIPT="ru" ;;
        --lang=en) LANG_SCRIPT="en" ;;
    esac
done

# 2) переменная окружения VPN_LANG
if [[ -z "$LANG_SCRIPT" && -n "${VPN_LANG:-}" ]]; then
    case "${VPN_LANG,,}" in
        ru) LANG_SCRIPT="ru" ;;
        en) LANG_SCRIPT="en" ;;
    esac
fi

# 3) автоопределение по системной локали
if [[ -z "$LANG_SCRIPT" ]]; then
    if [[ "${LANG:-}${LC_ALL:-}" == ru* || "${LANG:-}" == *RU* ]]; then
        LANG_SCRIPT="ru"
    else
        LANG_SCRIPT="en"
    fi
fi

# ============================================================
#  СЛОВАРЬ ПЕРЕВОДОВ
# ============================================================

L() {
    local key="$1"; shift || true
    local fmt=""
    case "$LANG_SCRIPT:$key" in
        ru:root_required) fmt="Запусти скрипт с правами root (sudo/su/doas)." ;;
        en:root_required) fmt="Please run this script as root (sudo/su/doas)." ;;

        ru:title) fmt="SoftEther VPN — менеджер подключений" ;;
        en:title) fmt="SoftEther VPN — Connection Manager" ;;

        ru:client_not_found) fmt="SoftEther VPN Client не найден. Устанавливаем..." ;;
        en:client_not_found) fmt="SoftEther VPN Client not found. Installing..." ;;

        ru:apt_trying) fmt="Пробуем установить через apt (softether-vpnclient)..." ;;
        en:apt_trying) fmt="Trying to install via apt (softether-vpnclient)..." ;;

        ru:apt_installed) fmt="Установлено через apt." ;;
        en:apt_installed) fmt="Installed via apt." ;;

        ru:apt_unavailable) fmt="Пакет softether-vpnclient недоступен или установка не удалась." ;;
        en:apt_unavailable) fmt="Package softether-vpnclient is unavailable or install failed." ;;

        ru:manual_header) fmt="Не удалось установить автоматически." ;;
        en:manual_header) fmt="Automatic install failed." ;;

        ru:manual_install_title) fmt="Установи вручную:" ;;
        en:manual_install_title) fmt="Install manually:" ;;

        ru:manual_step1) fmt="Скачай архив клиента:" ;;
        en:manual_step1) fmt="Download the client archive:" ;;

        ru:manual_step2) fmt="Собери:" ;;
        en:manual_step2) fmt="Build it:" ;;

        ru:manual_step3) fmt="Перемести в %s:" ;;
        en:manual_step3) fmt="Move it to %s:" ;;

        ru:manual_after) fmt="После этого запусти скрипт снова." ;;
        en:manual_after) fmt="Then run the script again." ;;

        ru:install_failed) fmt="Установка не удалась, бинарники не найдены." ;;
        en:install_failed) fmt="Install failed, binaries not found." ;;

        ru:daemon_starting) fmt="Демон vpnclient не запущен, стартуем..." ;;
        en:daemon_starting) fmt="vpnclient daemon is not running, starting..." ;;

        ru:daemon_started_systemd) fmt="Служба %s запущена." ;;
        en:daemon_started_systemd) fmt="Service %s started." ;;

        ru:daemon_started_manual) fmt="Демон vpnclient запущен." ;;
        en:daemon_started_manual) fmt="vpnclient daemon started." ;;

        ru:no_accounts) fmt="Сохранённых подключений пока нет." ;;
        en:no_accounts) fmt="No saved connections yet." ;;

        ru:how_to_add) fmt="Как добавить?" ;;
        en:how_to_add) fmt="How do you want to add one?" ;;

        ru:opt_import) fmt="Импортировать .vpn файл" ;;
        en:opt_import) fmt="Import a .vpn file" ;;

        ru:opt_manual) fmt="Создать вручную" ;;
        en:opt_manual) fmt="Create manually" ;;

        ru:opt_exit) fmt="Выход" ;;
        en:opt_exit) fmt="Exit" ;;

        ru:invalid_choice) fmt="Неверный выбор." ;;
        en:invalid_choice) fmt="Invalid choice." ;;

        ru:import_prompt_path) fmt="Путь к файлу профиля (.vpn):" ;;
        en:import_prompt_path) fmt="Path to the profile file (.vpn):" ;;

        ru:file_not_found) fmt="Файл не найден: %s" ;;
        en:file_not_found) fmt="File not found: %s" ;;

        ru:importing) fmt="Импортируем профиль..." ;;
        en:importing) fmt="Importing profile..." ;;

        ru:imported_ok) fmt="Профиль импортирован." ;;
        en:imported_ok) fmt="Profile imported." ;;

        ru:manual_prompt_name) fmt="Имя подключения:" ;;
        en:manual_prompt_name) fmt="Connection name:" ;;

        ru:manual_prompt_server) fmt="Адрес сервера (host:port):" ;;
        en:manual_prompt_server) fmt="Server address (host:port):" ;;

        ru:manual_prompt_hub) fmt="Virtual Hub:" ;;
        en:manual_prompt_hub) fmt="Virtual Hub:" ;;

        ru:manual_prompt_user) fmt="Имя пользователя:" ;;
        en:manual_prompt_user) fmt="Username:" ;;

        ru:manual_prompt_pass) fmt="Пароль:" ;;
        en:manual_prompt_pass) fmt="Password:" ;;

        ru:creating_nic) fmt="Создаём виртуальный адаптер '%s'..." ;;
        en:creating_nic) fmt="Creating virtual adapter '%s'..." ;;

        ru:creating_account) fmt="Создаём подключение '%s'..." ;;
        en:creating_account) fmt="Creating connection '%s'..." ;;

        ru:setting_password) fmt="Задаём пароль..." ;;
        en:setting_password) fmt="Setting password..." ;;

        ru:account_created) fmt="Аккаунт '%s' создан." ;;
        en:account_created) fmt="Account '%s' created." ;;

        ru:add_failed) fmt="Не удалось добавить аккаунт." ;;
        en:add_failed) fmt="Failed to add account." ;;

        ru:available_connections) fmt="Доступные подключения:" ;;
        en:available_connections) fmt="Available connections:" ;;

        ru:select_number) fmt="Выбери номер:" ;;
        en:select_number) fmt="Choose a number:" ;;

        ru:status_connected) fmt="connected" ;;
        en:status_connected) fmt="connected" ;;

        ru:status_offline) fmt="offline" ;;
        en:status_offline) fmt="offline" ;;

        ru:account_is) fmt="Аккаунт %s сейчас:" ;;
        en:account_is) fmt="Account %s is currently:" ;;

        ru:what_to_do) fmt="Что сделать?" ;;
        en:what_to_do) fmt="What do you want to do?" ;;

        ru:act_connect) fmt="Подключить" ;;
        en:act_connect) fmt="Connect" ;;

        ru:act_disconnect) fmt="Отключить" ;;
        en:act_disconnect) fmt="Disconnect" ;;

        ru:act_cancel) fmt="Отмена" ;;
        en:act_cancel) fmt="Cancel" ;;

        ru:cancelled) fmt="Отменено." ;;
        en:cancelled) fmt="Cancelled." ;;

        ru:step_connecting) fmt="Подключаем '%s'..." ;;
        en:step_connecting) fmt="Connecting '%s'..." ;;

        ru:step_waiting) fmt="Ждём установления соединения" ;;
        en:step_waiting) fmt="Waiting for the session to establish" ;;

        ru:connected_ok) fmt="Соединение установлено." ;;
        en:connected_ok) fmt="Connection established." ;;

        ru:session_fail) fmt="Не удалось подтвердить установление сессии. Статус:" ;;
        en:session_fail) fmt="Could not confirm session establishment. Status:" ;;

        ru:vpncmd_failed) fmt="Команда vpncmd не выполнена: %s. Ответ клиента:" ;;
        en:vpncmd_failed) fmt="vpncmd command failed: %s. Client response:" ;;

        ru:iface_not_found) fmt="Не удалось найти интерфейс vpn_*." ;;
        en:iface_not_found) fmt="Could not find a vpn_* interface." ;;

        ru:iface_fallback) fmt="Не удалось точно определить интерфейс аккаунта, использую первый найденный: %s" ;;
        en:iface_fallback) fmt="Could not determine the exact interface for this account, using the first one found: %s" ;;

        ru:step_requesting_ip) fmt="Запрашиваем IP на %s..." ;;
        en:step_requesting_ip) fmt="Requesting IP on %s..." ;;

        ru:ip_ready) fmt="Готово. Текущий адрес интерфейса %s:" ;;
        en:ip_ready) fmt="Done. Current address of %s:" ;;

        ru:ip_not_received) fmt="IP-адрес не получен за %sс." ;;
        en:ip_not_received) fmt="No IP address received within %ss." ;;

        ru:ip_hint1) fmt="Возможно, на сервере не включён DHCP/SecureNAT на этом Hub'е." ;;
        en:ip_hint1) fmt="The server's Hub may not have DHCP/SecureNAT enabled." ;;

        ru:ip_hint2) fmt="Проверь вручную: sudo dhclient -v %s" ;;
        en:ip_hint2) fmt="Check manually: sudo dhclient -v %s" ;;

        ru:step_disconnecting) fmt="Отключаем '%s'..." ;;
        en:step_disconnecting) fmt="Disconnecting '%s'..." ;;

        ru:step_clearing_ip) fmt="Очищаем IP на %s..." ;;
        en:step_clearing_ip) fmt="Clearing IP on %s..." ;;

        ru:disconnected_ok) fmt="'%s' отключён." ;;
        en:disconnected_ok) fmt="'%s' disconnected." ;;

        *) fmt="$key" ;;
    esac
    # shellcheck disable=SC2059
    printf "$fmt" "$@"
}

# ============================================================
#  ЦВЕТА И ОФОРМЛЕНИЕ
# ============================================================

if [[ -t 1 ]]; then
    C_RESET='\033[0m'
    C_BOLD='\033[1m'
    C_DIM='\033[2m'
    C_RED='\033[0;31m'
    C_GREEN='\033[0;32m'
    C_YELLOW='\033[0;33m'
    C_BLUE='\033[0;34m'
    C_CYAN='\033[0;36m'
    C_WHITE='\033[1;37m'
    B_GREEN='\033[1;32m'
    B_RED='\033[1;31m'
    B_YELLOW='\033[1;33m'
    B_CYAN='\033[1;36m'
else
    C_RESET=''; C_BOLD=''; C_DIM=''; C_RED=''; C_GREEN=''; C_YELLOW=''
    C_BLUE=''; C_CYAN=''; C_WHITE=''
    B_GREEN=''; B_RED=''; B_YELLOW=''; B_CYAN=''
fi

ICON_OK="${B_GREEN}✔${C_RESET}"
ICON_FAIL="${B_RED}✘${C_RESET}"
ICON_WARN="${B_YELLOW}!${C_RESET}"
ICON_ARROW="${C_CYAN}→${C_RESET}"

msg()  { echo -e "${C_CYAN}${ICON_ARROW}${C_RESET} $*"; }
ok()   { echo -e "${ICON_OK} ${C_GREEN}$*${C_RESET}"; }
warn() { echo -e "${ICON_WARN} ${C_YELLOW}$*${C_RESET}"; }
err()  { echo -e "${ICON_FAIL} ${C_RED}$*${C_RESET}" >&2; }
step() { echo -e "${C_BLUE}${C_BOLD}[$1]${C_RESET} $2"; }

hr() {
    local width=54
    printf "${C_DIM}%${width}s${C_RESET}\n" | tr ' ' '='
}

title() {
    hr
    echo -e "${B_CYAN}${C_BOLD}  $1${C_RESET}"
    hr
}

# ---------- Проверка root ----------
if [[ $EUID -ne 0 ]]; then
    err "$(L root_required)"
    exit 1
fi

clear 2>/dev/null || true
title "$(L title)"

# ============================================================
#  БЛОК 1. УСТАНОВКА КЛИЕНТА
# ============================================================

find_binaries() {
    if command -v vpncmd > /dev/null 2>&1; then
        VPNCMD_BIN="$(command -v vpncmd)"
    elif [[ -x "$VPNCLIENT_MANUAL_DIR/vpncmd" ]]; then
        VPNCMD_BIN="$VPNCLIENT_MANUAL_DIR/vpncmd"
    fi

    if command -v vpnclient > /dev/null 2>&1; then
        VPNCLIENT_BIN="$(command -v vpnclient)"
    elif [[ -x "$VPNCLIENT_MANUAL_DIR/vpnclient" ]]; then
        VPNCLIENT_BIN="$VPNCLIENT_MANUAL_DIR/vpnclient"
    fi
}

install_client() {
    warn "$(L client_not_found)"

    if command -v apt > /dev/null 2>&1; then
        msg "$(L apt_trying)"
        if apt-get update -qq && apt-get install -y softether-vpnclient; then
            find_binaries
            if [[ -n "$VPNCLIENT_BIN" && -n "$VPNCMD_BIN" ]]; then
                ok "$(L apt_installed)"
                return 0
            fi
        fi
        warn "$(L apt_unavailable)"
    fi

    echo ""
    err "$(L manual_header)"
    echo -e "${C_WHITE}$(L manual_install_title)${C_RESET}"
    echo -e "  ${C_DIM}1.${C_RESET} $(L manual_step1)"
    echo -e "     ${C_CYAN}https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases${C_RESET}"
    echo -e "  ${C_DIM}2.${C_RESET} $(L manual_step2)"
    echo -e "     ${C_YELLOW}tar xzf softether-vpnclient-*.tar.gz && cd vpnclient && make${C_RESET}"
    echo -e "  ${C_DIM}3.${C_RESET} $(L manual_step3 "$VPNCLIENT_MANUAL_DIR")"
    echo -e "     ${C_YELLOW}sudo mkdir -p $VPNCLIENT_MANUAL_DIR && sudo cp vpnclient vpncmd $VPNCLIENT_MANUAL_DIR/${C_RESET}"
    echo ""
    msg "$(L manual_after)"
    exit 1
}

ensure_installed() {
    find_binaries
    if [[ -z "$VPNCLIENT_BIN" || -z "$VPNCMD_BIN" ]]; then
        install_client
        find_binaries
        if [[ -z "$VPNCLIENT_BIN" || -z "$VPNCMD_BIN" ]]; then
            err "$(L install_failed)"
            exit 1
        fi
    fi
}

ensure_running() {
    if pgrep -x "vpnclient" > /dev/null 2>&1; then
        return 0
    fi

    msg "$(L daemon_starting)"

    if systemctl list-unit-files 2>/dev/null | grep -q "^${SYSTEMD_SERVICE}\.service"; then
        systemctl start "$SYSTEMD_SERVICE"
        sleep 2
        ok "$(L daemon_started_systemd "$SYSTEMD_SERVICE")"
        return 0
    fi

    "$VPNCLIENT_BIN" start
    sleep 2
    ok "$(L daemon_started_manual)"
}

# ============================================================
#  БЛОК 2. НАСТРОЙКА АККАУНТА
# ============================================================

get_accounts() {
    local raw
    raw=$("$VPNCMD_BIN" localhost /CLIENT /CMD AccountList 2>/dev/null)
    echo "$raw" \
        | awk -F'\\|' '/VPN Connection Setting Name/{gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2}'
}

# Выполняет команду vpncmd; при ошибке показывает её вывод и возвращает 1.
# В сообщение попадает только имя команды (без аргументов, чтобы не светить пароль).
vpn_run() {
    local out
    if ! out=$("$VPNCMD_BIN" localhost /CLIENT /CMD "$@" 2>&1); then
        err "$(L vpncmd_failed "$1")"
        echo "$out" >&2
        return 1
    fi
}

import_account() {
    local file
    read -e -rp "$(echo -e "${C_CYAN}$(L import_prompt_path)${C_RESET} ")" file
    if [[ ! -f "$file" ]]; then
        err "$(L file_not_found "$file")"
        return 1
    fi
    msg "$(L importing)"
    "$VPNCMD_BIN" localhost /CLIENT /CMD AccountImport "$file"
    ok "$(L imported_ok)"
}

create_account_manually() {
    local acc_name server hub user nic pass

    read -rp "$(echo -e "${C_CYAN}$(L manual_prompt_name)${C_RESET} ")" acc_name
    read -rp "$(echo -e "${C_CYAN}$(L manual_prompt_server)${C_RESET} ")" server
    read -rp "$(echo -e "${C_CYAN}$(L manual_prompt_hub)${C_RESET} ")" hub
    read -rp "$(echo -e "${C_CYAN}$(L manual_prompt_user)${C_RESET} ")" user
    read -rsp "$(echo -e "${C_CYAN}$(L manual_prompt_pass)${C_RESET} ")" pass
    echo ""

    nic="${acc_name}_nic"

    if ! "$VPNCMD_BIN" localhost /CLIENT /CMD NicList 2>/dev/null | grep -qi "$nic"; then
        msg "$(L creating_nic "$nic")"
        vpn_run NicCreate "$nic" || return 1
    fi

    msg "$(L creating_account "$acc_name")"
    vpn_run AccountCreate "$acc_name" \
        "/SERVER:$server" "/HUB:$hub" "/USERNAME:$user" "/NICNAME:$nic" || return 1

    msg "$(L setting_password)"
    vpn_run AccountPasswordSet "$acc_name" \
        "/PASSWORD:$pass" "/TYPE:standard" || return 1

    ok "$(L account_created "$acc_name")"
}

ensure_account_exists() {
    mapfile -t accounts < <(get_accounts)
    if [[ ${#accounts[@]} -gt 0 ]]; then
        return 0
    fi

    warn "$(L no_accounts)"
    echo -e "${C_WHITE}$(L how_to_add)${C_RESET}"
    PS3="$(echo -e "${C_CYAN}#?${C_RESET} ")"
    select choice in "$(L opt_import)" "$(L opt_manual)" "$(L opt_exit)"; do
        case "$choice" in
            "$(L opt_import)") import_account && break ;;
            "$(L opt_manual)") create_account_manually && break ;;
            "$(L opt_exit)") exit 0 ;;
            *) warn "$(L invalid_choice)" ;;
        esac
    done

    mapfile -t accounts < <(get_accounts)
    if [[ ${#accounts[@]} -eq 0 ]]; then
        err "$(L add_failed)"
        exit 1
    fi
}

# ============================================================
#  БЛОК 3. ВЫБОР АККАУНТА И ДЕЙСТВИЯ
# ============================================================

find_iface() {
    ip -o link show | awk -F': ' '{print $2}' | grep -i "^vpn_" | head -n1
}

# Пытается определить интерфейс именно выбранного аккаунта через его
# "Virtual Network Adapter Name" (Linux-интерфейс = vpn_<имя_адаптера>).
# Возвращает пусто, если не удалось — тогда используется find_iface (первый попавшийся).
find_iface_for_account() {
    local acc="$1" nic iface
    nic=$(timeout 3 "$VPNCMD_BIN" localhost /CLIENT /CMD AccountGet "$acc" 2>/dev/null \
        | awk -F'\\|' '/Device Name Used for Connection/{gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2; exit}') || true

    if [[ -z "$nic" ]]; then
        return 1
    fi

    iface="vpn_${nic,,}"
    if ip link show "$iface" > /dev/null 2>&1; then
        echo "$iface"
        return 0
    fi
    return 1
}

account_state() {
    local acc="$1" status
    status=$("$VPNCMD_BIN" localhost /CLIENT /CMD AccountStatusGet "$acc" 2>/dev/null || true)
    if echo "$status" | grep -qiE "Session Established|Connection Completed|\|\s*Connected"; then
        echo "connected"
    else
        echo "disconnected"
    fi
}

main_menu() {
    mapfile -t accounts < <(get_accounts)

    echo ""
    echo -e "${C_WHITE}${C_BOLD}$(L available_connections)${C_RESET}"
    hr

    local i=1
    for acc in "${accounts[@]}"; do
        local st
        st=$(account_state "$acc")
        if [[ "$st" == "connected" ]]; then
            printf "  ${C_DIM}%d)${C_RESET} %-24s ${B_GREEN}● %s${C_RESET}\n" "$i" "$acc" "$(L status_connected)"
        else
            printf "  ${C_DIM}%d)${C_RESET} %-24s ${C_DIM}○ %s${C_RESET}\n" "$i" "$acc" "$(L status_offline)"
        fi
        ((i++))
    done
    hr
    echo ""

    PS3="$(echo -e "${C_CYAN}$(L select_number)${C_RESET} ")"
    select ACCOUNT_NAME in "${accounts[@]}"; do
        [[ -n "${ACCOUNT_NAME:-}" ]] && break
        warn "$(L invalid_choice)"
    done

    local current_state
    current_state=$(account_state "$ACCOUNT_NAME")

    echo ""
    if [[ "$current_state" == "connected" ]]; then
        echo -e "$(L account_is "$ACCOUNT_NAME") ${B_GREEN}● $(L status_connected)${C_RESET}"
    else
        echo -e "$(L account_is "$ACCOUNT_NAME") ${C_DIM}○ $(L status_offline)${C_RESET}"
    fi

    echo -e "${C_WHITE}$(L what_to_do)${C_RESET}"
    PS3="$(echo -e "${C_CYAN}#?${C_RESET} ")"
    select action in "$(L act_connect)" "$(L act_disconnect)" "$(L act_cancel)"; do
        case "$action" in
            "$(L act_connect)"|"$(L act_disconnect)"|"$(L act_cancel)") break ;;
            *) warn "$(L invalid_choice)" ;;
        esac
    done

    case "$action" in
        "$(L act_connect)") do_connect "$ACCOUNT_NAME" ;;
        "$(L act_disconnect)") do_disconnect "$ACCOUNT_NAME" ;;
        "$(L act_cancel)") msg "$(L cancelled)" ;;
    esac
}

do_connect() {
    local acc="$1"
    echo ""
    step "1/3" "$(L step_connecting "$acc")"
    vpn_run AccountConnect "$acc" || exit 1

    step "2/3" "$(L step_waiting)"
    local status
    for i in $(seq 1 10); do
        status=$("$VPNCMD_BIN" localhost /CLIENT /CMD AccountStatusGet "$acc" 2>/dev/null || true)
        if echo "$status" | grep -qiE "Session Established|Connection Completed|\|\s*Connected"; then
            ok "$(L connected_ok)"
            break
        fi
        echo -ne "${C_DIM}.${C_RESET}"
        sleep 1
        if [[ "$i" -eq 10 ]]; then
            echo ""
            err "$(L session_fail)"
            echo "$status" >&2
            exit 1
        fi
    done

    local iface
    iface=$(find_iface_for_account "$acc")
    if [[ -z "$iface" ]]; then
        iface=$(find_iface)
        if [[ -n "$iface" ]]; then
            warn "$(L iface_fallback "$iface")"
        fi
    fi
    if [[ -z "$iface" ]]; then
        err "$(L iface_not_found)"
        exit 1
    fi

    step "3/3" "$(L step_requesting_ip "$iface")"
    ip link set "$iface" up

    if command -v dhclient > /dev/null; then
        timeout "$DHCP_TIMEOUT" dhclient "$iface" > /dev/null 2>&1 || true
    elif command -v dhcpcd > /dev/null; then
        timeout "$DHCP_TIMEOUT" dhcpcd "$iface" > /dev/null 2>&1 || true
    fi

    local waited=0
    while [[ $waited -lt $DHCP_TIMEOUT ]]; do
        if ip -4 addr show "$iface" | grep -q "inet "; then
            break
        fi
        sleep 1
        waited=$((waited + 1))
    done

    echo ""
    if ip -4 addr show "$iface" | grep -q "inet "; then
        ok "$(L ip_ready "$iface")"
        echo -e "${C_GREEN}"
        ip -4 addr show "$iface" | sed 's/^/  /'
        echo -e "${C_RESET}"
    else
        warn "$(L ip_not_received "$DHCP_TIMEOUT")"
        echo -e "${C_DIM}$(L ip_hint1)${C_RESET}"
        echo -e "${C_DIM}$(L ip_hint2 "$iface")${C_RESET}"
    fi
}

do_disconnect() {
    local acc="$1"
    local iface
    iface=$(find_iface_for_account "$acc") || true
    if [[ -z "$iface" ]]; then
        iface=$(find_iface)
        if [[ -n "$iface" ]]; then
            warn "$(L iface_fallback "$iface")"
        fi
    fi

    echo ""
    step "1/2" "$(L step_disconnecting "$acc")"
    if ! vpn_run AccountDisconnect "$acc"; then
        err "$(L vpncmd_failed "AccountDisconnect")"
        return 1
    fi

    if [[ -n "$iface" ]]; then
        step "2/2" "$(L step_clearing_ip "$iface")"
        if command -v dhclient > /dev/null; then
            dhclient -r "$iface" 2>/dev/null || true
        elif command -v dhcpcd > /dev/null; then
            dhcpcd -k "$iface" 2>/dev/null || true
        fi
        ip addr flush dev "$iface" 2>/dev/null || true
    fi

    echo ""
    ok "$(L disconnected_ok "$acc")"
}

# ============================================================
#  ГЛАВНЫЙ ПОТОК
# ============================================================

ensure_installed
ensure_running
ensure_account_exists
main_menu
