
___x_cmd_cosmo___download(){
    local usl_strategy=npm
    if ___x_cmd websrc is internet; then
        usl_strategy=github
    fi

    if [ -n "$___X_CMD_GHACTION_INSIDE" ]; then
        usl_strategy=github
    else
        case "$___X_CMD_COSMO_DOWNLOAD_SOURCE" in
            github)     usl_strategy=github  ;;
            npm)        usl_strategy=npm  ;;
            *)          ;;
        esac
    fi
    ___x_cmd_cosmo___download_"$usl_strategy" "$@"
}

___x_cmd_cosmo___download_github(){
    local name="$1";        [ -n "$name" ] || N=cosmo M="Provide a package name" log:ret:1

    local download_file_ext="tar.xz"
    local url="https://github.com/x-cmd-cosmo/cosmos/releases/download/$___X_CMD_COSMO_VERSION/$name.$download_file_ext"
    local ball="$___X_CMD_COSMO_DOWNLOAD_PATH/$name"

    [ -d "$ball" ] || ___x_cmd_cmds_mkdir -p "$ball"
    ___x_cmd_cosmo___download_inner_ "$url" "$ball/${name}.$download_file_ext" || return $?

}

___x_cmd_cosmo___download_npm(){
    local name="$1";        [ -n "$name" ] || N=cosmo M="Provide a package name" log:ret:1

    local zipname="cosmos-0.0.7-$name.tgz"
    local url="https://registry.npmmirror.com/@x-cmd-cosmo/cosmos/-/$zipname"
    if ! ___x_cmd websrc is cn; then
        url="https://registry.npmjs.org/@x-cmd-cosmo/cosmos/-/$zipname"
    fi
    local ball_dir="$___X_CMD_COSMO_DOWNLOAD_PATH/$name"
    local ball="$___X_CMD_COSMO_DOWNLOAD_PATH/$name/${name}.tgz"


    [ -d "$ball_dir" ] || ___x_cmd_cmds_mkdir -p "$ball_dir"
    ___x_cmd_cosmo___download_inner_ "$url" "$ball" || return $?

    local npm_package="$___X_CMD_COSMO_DOWNLOAD_PATH/$name/package"

    # In the future: ___x_cmd busybox tar
    # TODO: ___x_cmd p7zd
    ___X_CMD_ZUZ_QUIET=1 ___x_cmd uz "$ball"  "$___X_CMD_COSMO_DOWNLOAD_PATH/$name" || N=cosmo M='Unzip npm package failed'  log:ret:1

    local x_=; ___x_cmd fsiter --file01_ "$npm_package/dist"                        || return $?
    ___x_cmd mv "$npm_package/dist/$x_" "$___X_CMD_COSMO_DOWNLOAD_PATH/$name"       || N=cosmo M='Move npm package failed'   log:ret:1
    ___x_cmd_cmds rm -rf "$ball" "$npm_package"                                     || N=cosmo M='Remove npm package failed' log:ret:1

    local download_file_ext="tar.xz"
    ball="$___X_CMD_COSMO_DOWNLOAD_PATH/$name/${name}.$download_file_ext"
}

___x_cmd_cosmo___download_inner_(){
    local url="$1";  [ -n "$url" ]  || return $?
    local ball="$2"; [ -n "$ball" ] || return $?

    cosmo:info \
        -m "download $name, thanks to the courtesy of ${url%/"${url#*//*/}"}" \
        --url "$url" --destination "$ball" --name "$name"
    (
        ___x_cmd curl -I "$url" | {
            trap 'printf "\r\n"; cosmo:error "Download interrupted"; ___x_cmd_cosmo___download_remove___ball $name; return 130;' INT
            read -r head;
            head="${head#* }"; head="${head%% *}"
            case "$head" in
                2??|3??)
                    if ! ___x_cmd curl --progress-bar --location --retry-max-time 10 --retry 0 "$url" --output "$ball"; then
                        cosmo:error "Fail to download from $url"
                        ___x_cmd_cmds rm -rf "$ball"
                        return 1
                    fi
                    ;;
                *)
                    printf "\r"
                    cosmo:error "resource invalid => $url"
                    return 1
                    ;;
            esac
        } || return $?
    ) || return $?
}

___x_cmd_cosmo___download_remove___ball(){
    local name="$1";        [ -n "$name" ]                      || N=cosmo M="Provide a package name" log:ret:64
    local dir="$___X_CMD_COSMO_DOWNLOAD_PATH/$name"
    local ball="$dir/${name}.${download_file_ext}"
    cosmo:info "Trying to remove $ball"
    [ ! -f "$ball" ] || ___x_cmd_cmds rm -rf "$ball"            || N=cosmo M="Remove $ball failed"    log:ret:1
    [ ! -d "$dir" ]  || ! ___x_cmd fsiter --dirempty "$dir"     || ___x_cmd_cmds rm -rf "$dir"
}
