# shellcheck    shell=sh    disable=SC2039,SC3043
# Notice: ___x_cmd_http_qs_put will put the empty value

___x_cmd_http_qs() {
    param:subcmd ______x_cmd_http_qs            \
        dump                    "get all qs"    \
        get                     "get qs"        \
        put                     "put qs"        \
        remove                  "remove qs"     \
        mput                    "set more qs"
    param:subcmd:try
    param:run

    ___x_cmd_http_qs _param_help_doc
    return 1
}

______x_cmd_http_qs_dump(){
    param:void
    case "$1" in
        json)
            O=$O ___x_cmd_dict scope qs | ___x_cmd_dict_pjson
            ;;
        curl)
            local line
            printf "%s" " -G "
            O=$O ___x_cmd_dict scope qs | KV_SEP="=" ___x_cmd_dict_pprint | while read -r line; do
                # printf "--data-urlencode \"%s\" " "$line"
                printf " %s " "--data-urlencode $line"
            done
            ;;
        *) O=$O ___x_cmd_dict scope qs | KV_SEP="=" ___x_cmd_dict_pprint ;;
    esac
}

______x_cmd_http_qs_get(){
    param:void
    O=$O ___x_cmd_dict get qs "${1:?header key}"
}

______x_cmd_http_qs_put(){
    param:void
    local header_key="${1:?header key}"
    if [ $# -eq 1 ]; then
        eval "O=$O" ___x_cmd_dict put qs "\$header_key" "\$${header_key}"
    else
        O=$O ___x_cmd_dict put qs "$header_key" "$2"
    fi
}

______x_cmd_http_qs_remove(){
    param:void
    O=$O ___x_cmd_dict drop qs "${1:?header key}"
}

______x_cmd_http_qs_mput(){
    # Notice 1: `___x_cmd_http_qs_put abc=``  will put the entry { abc: "" }
    # Notice 2: `abc=; ___x_cmd_http_qs_put abc` will NOT put any entry
    param:void
    local value
    local i; for i in "$@"; do
        # if [[ "$i" = *=* ]]; then
        if [ "$i" != "${i%%=*}" ]; then
            ______x_cmd_http_qs_put "${i%%=*}" "${i#*=}"
        else
            eval value="\"\$${i}\""
            [ -n "$value" ] && ______x_cmd_http_qs_put "$i" "$value"
        fi
    done
}
