_panel_management() {
    local cur prev words cword
    _init_completion || return

    # --- вспомогательная проверка: есть ли уже токен в строке ---
    _pm_has() {
        local needle="$1" w
        for w in "${words[@]:1}"; do
            [[ "$w" == "$needle" ]] && return 0
        done
        return 1
    }

    # --- фильтр: из строки опций убрать те, что уже введены ---
    # usage: _pm_filter "$opts"
    _pm_filter() {
        local opts="$1" tok result=""
        for tok in $opts; do
            _pm_has "$tok" || result+=" $tok"
        done
        echo "$result"
    }

    local commands="help list run setup -h"
    local sub_opts="-p -n -c"

    # ---- 1. После "-p 1" → предлагаем --nextouch-ip ----
    if [[ "$prev" == "1" && "${words[cword-2]}" == "-p" ]]; then
        local opts
        opts=$(_pm_filter "--nextouch-ip")
        COMPREPLY=( $(compgen -W "$opts" -- "$cur") )
        return
    fi

    # ---- 2. После "-p" → предлагаем 0 или 1 ----
    # (0 и 1 — это значения, не флаги, повторять их через _pm_filter не нужно)
    if [[ "$prev" == "-p" ]]; then
        COMPREPLY=( $(compgen -W "0 1" -- "$cur") )
        return
    fi

    # ---- 3. Первый уровень: команды ----
    # Здесь тоже уберём уже введённые команды (на случай "run run")
    if [[ $cword -eq 1 ]]; then
        local opts
        opts=$(_pm_filter "$commands")
        COMPREPLY=( $(compgen -W "$opts" -- "$cur") )
        return
    fi

    # ---- 4. Ищем, введена ли подкоманда ----
    local subcmd="" w
    for w in "${words[@]:1}"; do
        case "$w" in
            list|setup|run) subcmd="$w"; break ;;
        esac
    done

    # ---- 5. Внутри подкоманды — опции с учётом взаимоисключения и повторов ----
    if [[ -n "$subcmd" ]]; then
        local opts
        opts=$(_pm_filter "$sub_opts")
        COMPREPLY=( $(compgen -W "$opts" -- "$cur") )
        return
    fi
}

complete -F _panel_management panel-management