# shellcheck shell=dash     disable=SC2016


# mv :git/main :git/new
# rm :git/main
# rm :git/main
# rm :git/github/main
# mv :git/main :git/work
___x_cmd_git_branch(){
    [ "$#" -gt 0 ]  ||  set - ls
    local op="$1";      shift
    case "$op" in
        mv)                         ___x_cmd___git_origin branch -m "$@" ;;
        cp)                         ___x_cmd___git_origin branch -c "$@" ;;
        rm)                         ___x_cmd___git_origin branch -d "$@" ;;
        ls|desc|map)                "___x_cmd_git_branch_${op}" "$@" ;;
        *)                          ___x_cmd___git_origin branch "$@" ;;
    esac
}

___x_cmd_git_branch_desc(){
    case "$#" in
        0)      command git config --get-regexp "branch.[^.]+.description" ;;      # TODO: show all descriptions
        1)      command git config "branch.$1.description" ;;
        *)      command git config "branch.$1.description" "$2" ;;      # TODO: change the description of the branch
    esac
}

___x_cmd_git_branch_ls(){
    ___x_cmd___git_origin branch "$@"
}

___x_cmd_git_branch_map_fn(){   printf "%s\n" "$1"; }

# ___x_cmd_git_branch_map(){
#     local src="${1:-origin}"
#     ___x_cmd___git_origin branch -r | command grep -v '\->' | \
#         command grep -E "^ +${src}" |
#         while read -r remote; do
#             ___x_cmd_git_branch_map_fn "${remote#"${src}/"}"
#         done
#     ___x_cmd_git_branch_map_fn(){   printf "%s\n" "$1"; }
# }

___X_CMD_GIT_BRANCH_MAP_AWK_META='
    { gsub("^[ ]+", "", $0); }
    $0~/\-\>/{ next; }
'

___X_CMD_GIT_BRANCH_MAP_AWK="$___X_CMD_GIT_BRANCH_MAP_AWK_META"'
    src==""{ print; next; }
    $0~"^"src"/"{
        gsub("^" src "/", "", $0)
        print
    }
'

___x_cmd_git_branch_map(){
    local src="${1:-origin}"
    local code="${2}"

    ___x_cmd___git_origin branch -r | {
        if [ "$code" != "" ]; then
            ___x_cmd_cmds_awk -v src="${src}" "${___X_CMD_GIT_BRANCH_MAP_AWK_META}${code}"
        else
            ___x_cmd_cmds_awk -v src="${src}" "${___X_CMD_GIT_BRANCH_MAP_AWK}" |\
            while read -r remote; do
                ___x_cmd_git_branch_map_fn "$remote"
            done
        fi
    }

    ___x_cmd_git_branch_map_fn(){   printf "%s\n" "$1"; }
}
