# shellcheck shell=dash disable=2016
___x_cmd_winget_ls(){
    [ "$#" -gt 0 ] ||       set -- -i

    case "$1" in
        -i|--installed)     shift; ___x_cmd_winget_ls___install "$@"    ;;
        -a|--all)           shift; ___x_cmd_winget_ls___all     "$@"    ;;

        -h|--help)          shift; ___x_cmd help -m winget ls           ;;
        *)                  ___x_cmd help -m winget ls >&2; return 64   ;;
    esac
}


___x_cmd_winget_ls___parse_list_data(){
    ___x_cmd_cmds awk -F '  +|--' '
DATA!=1{
    if ($0 ~ "^----------") DATA=1
    next
}
DATA==1{
    if ($1 !~ "^\\[\\(\\]\\)") {
        n = $1
        gsub( " [0-9].*$", "", n )
        if (arr[n] == 1) next
        print n
        arr[n] = 1
    }
}
'
}

___x_cmd_winget_ls___install_raw(){
    ___x_cmd_winget___bin list "$@" | \
        ___x_cmd_winget_ls___parse_list_data
}

___x_cmd_winget_ls___install(){
    local X_help_cmd; X_help_cmd='___x_cmd help -m winget ls -i' help:arg:parse
    { ___x_cmd_is_stdout2tty && ___x_cmd_runmode_allow_chatty; } || {
        ___x_cmd_winget_ls___install_raw "$@"
        return
    }
    winget:info "Find installed software"
    local x_=; ___x_cmd_winget___fzf_ ___x_cmd_winget_ls___install_raw "$@" || return $?
    [ -n "$x_" ] || {
        winget:error "Nor found software"
        return 1
    }

    local software="$x_"
    local _cmd=
    ___x_cmd ui select ,_cmd "NEXT"   \
        "x winget uninstall --exact \"$software\""      \
        "x winget find      --exact \"$software\""      \
        "x winget view      --exact \"$software\""      \
        "return"     || return $?

    [ -n "$_cmd" ] || return $?
    winget:info "cmd -> $_cmd"
    eval "$_cmd"
}

___x_cmd_winget_ls___all_raw(){
    [ "$#" -gt 0 ] || set -- ''
    ___x_cmd_winget___bin search --accept-source-agreements "$@" | \
        ___x_cmd_winget_ls___parse_list_data
}

___x_cmd_winget_ls___all(){
    local X_help_cmd; X_help_cmd='___x_cmd help -m winget ls -a' help:arg:parse
    [ "$#" -gt 0 ] || winget:info "Perhaps you can include parameters refine your search for better accuracy, e.g. \`x winget la 'zip'\`"
    { ___x_cmd_is_stdout2tty && ___x_cmd_runmode_allow_chatty; } || {
        ___x_cmd_winget_ls___all_raw "$@"
        return
    }
    winget:info "Find all software"
    local x_=; ___x_cmd_winget___fzf_ ___x_cmd_winget_ls___all_raw "$@" || return $?
    [ -n "$x_" ] || {
        winget:error "Nor found software"
        return 1
    }


    local software="$x_"
    local _cmd=
    ___x_cmd ui select ,_cmd "NEXT"   \
        "x winget install   --exact \"$software\""      \
        "x winget uninstall --exact \"$software\""      \
        "x winget find      --exact \"$software\""      \
        "x winget view      --exact \"$software\""      \
        "return"     || return $?

    [ -n "$_cmd" ] || return $?
    winget:info "cmd -> $_cmd"
    eval "$_cmd"
}


___x_cmd_winget___fzf_(){
    x_="$(
        ___X_CMD_RUNMODE="$___X_CMD_RUNMODE" \
        ___x_cmdexe winget --fzfdata "$@"
    )"
}

___x_cmd_winget___fzfdata(){
    "$@" | ___x_cmd fzf --ansi --reverse --cycle --exit-0 \
            --height 50% --preview-window right:70% \
            --preview='___x_cmdexe winget view {1}'
}
