# shellcheck shell=bash

_copyq_commands=(
    show hide toggle menu exit disable enable clipboard selection paste copy
    count select next previous add insert remove edit separator read write
    action popup tab removetab renametab exporttab importtab config eval session
    help
)

_copyq_list_sessions() {
    ss -l -x | sed -nE 's#.*/\.copyq-?(\S*)_s .*#\1#p'
}

_copyq_complete_words() {
    while read -r item; do
        COMPREPLY+=("$item")
    done < <(compgen -W "$1" -- "${COMP_WORDS[$COMP_CWORD]}")
}

_copyq_complete_lines() {
    while read -r item; do
        COMPREPLY+=("$item")
    done < <(IFS=$'\n' compgen -W "$1" -- "${COMP_WORDS[$COMP_CWORD]}")
}

_copyq_complete_files() {
    while read -r item; do
        COMPREPLY+=("$item")
    done < <(compgen -f -- "${COMP_WORDS[$COMP_CWORD]}")
}

_copyq_completions() {
    case "$COMP_CWORD" in
        1)
            case "${COMP_WORDS[$COMP_CWORD]}" in
                --*)
                    _copyq_complete_words '--session --help'
                    ;;
                -*)
                    _copyq_complete_words '-e -s -h'
                    ;;
                *)
                    _copyq_complete_words "${_copyq_commands[*]}"
                    ;;
            esac
            ;;
        2)
            case "${COMP_WORDS[$COMP_CWORD-1]}" in
                show)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq tab)"
                    ;;
                clipboard)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq clipboard -- ?)"
                    ;;
                selection)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq selection -- ?)"
                    ;;
                copy)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq clipboardFormatsToSave)"
                    ;;
                read)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq read -- ?)"
                    ;;
                write)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq clipboardFormatsToSave)"
                    ;;
                tab)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq tab)"
                    ;;
                removetab)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq tab)"
                    ;;
                renametab)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq tab)"
                    ;;
                exporttab)
                    _copyq_complete_files
                    ;;
                importtab)
                    _copyq_complete_files
                    ;;
                config)
                    pidof copyq &>/dev/null || return
                    _copyq_complete_lines "$(copyq config | grep '^[^ ]')"
                    ;;
                session|-s|--session)
                    _copyq_complete_lines "$(_copyq_list_sessions)"
                    ;;
                help|-h|--help)
                    _copyq_complete_words "${_copyq_commands[*]}"
                    ;;
            esac
            ;;
    esac
}

complete -o filenames -F _copyq_completions copyq
