# shellcheck shell=dash

___x_cmd_asdf___download(){
    ___x_cmd_asdf___download_inner "$@"

    ___x_cmd_asdf___is_activated || {
        asdf:info \
            --tip 'Add asdf to the PATH environment -> x asdf --activate' \
            "To use softwares installed globally by asdf, you have to add asdf bin folder to PATH"
    }
}

___x_cmd_asdf___download_inner(){
    local version="${1:-v0.16.7}"

    local x_
    local packagename=
    x_=; ___x_cmd_asdf___download_packagename_ "$version"   || return $?
    local packagename="$x_"

    local urlprefix=
    x_=; ___x_cmd_asdf___download_urlprefix_ "$version"     || return $?
    local urlprefix="$x_"

    local url="${urlprefix}/${packagename}"
    local ball="$___X_CMD_ASDF_DOWNLOAD_PATH/$version/$packagename"

    asdf:info "Trying download ==> 'asdf $version'"
    ___x_cmd rmrf "$ball"
    ___x_cmd_asdf___download___ball "$url" "$ball"      || N=asdf M="Download failed." log:ret:1

    asdf:info "Trying populate ==> 'asdf $version'"
    ___x_cmd_asdf___download_populate___ball "$ball"    || N=asdf M="Populate failed." log:ret:1

    asdf:info "Asdf $version download successfully!"
}

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

    asdf:info \
        -m "Download asdf, thanks to the courtesy of ${url%/"${url#*//*/}"}" \
        --url "$url" --ball "$ball" --name "asdf"

    (
        trap '___x_cmd_asdf___download_remove___ball "$ball"; return 130;' INT
        ___x_cmd curl --progress-bar --location --retry-max-time 10 --retry 0 "$url" > "$ball" || {
            ___x_cmd_asdf___download_remove___ball "$ball"
            return 1
        }
    )

}

___x_cmd_asdf___download_remove___ball(){
    local ball="$1"
    asdf:info "Trying to remove $ball"
    [ ! -f "$ball" ] || ___x_cmd rmrf "$ball"                    || N=asdf M="Remove $ball failed"    log:ret:1
}

___x_cmd_asdf___download_populate___ball(){
    local ball="$1"

    local bin_dir="$___X_CMD_ASDF_BIN_PATH"
    local bin_path="$___X_CMD_ASDF_BIN_PATH/$___X_CMD_ASDF_BIN"
    ___x_cmd ensurefp "$bin_path"

    asdf:info  --ball "$ball" --target_dir "$bin_dir" "Unpacking"
    [ ! -f "$bin_path" ] || ___x_cmd mv "$bin_path" "$bin_path.back"
    ___X_CMD_ZUZ_QUIET=1 ___x_cmd uzr "$ball" "$bin_dir"  || {
        [ ! -f "$bin_path.back" ] || ___x_cmd mv "$bin_path.back" "$bin_path"
        N=asdf M="Fail to unzip $ball" log:ret:1
    }
    [ ! -f "$bin_path.back" ] || ___x_cmd rmrf "$bin_path.back"
    ___x_cmd_cmds chmod +x "$bin_path"

    asdf:info "The 'asdf' binary is installed into '${bin_dir}'."
}


___x_cmd_asdf___download_urlprefix_(){
    local version="$1"
    # official: https://github.com/asdf-vm/asdf/releases
    if ! ___x_cmd websrc is cn; then
        x_="https://github.com/x-cmd-sourcecode/asdf/releases"
        if [ "$version" = latest ]; then    x_="${x_}/latest/download"
        else                                x_="${x_}/download/$version"
        fi
    else
        x_="https://codeberg.org/x-cmd-sourcecode/asdf/releases"
        x_="${x_}/download/$version"
    fi
}

___x_cmd_asdf___download_packagename_(){
    local version="$1"

    local name_suffix=
    ___x_cmd os name_
    case "$___X_CMD_OS_NAME_" in
        linux)      name_suffix=linux  ;;
        darwin)     name_suffix=darwin ;;
        *)          N=asdf M="Unsupported OS: $___X_CMD_OS_NAME_" log:ret:1
    esac

    local arch_suffix=
    ___x_cmd os arch_
    case "$___X_CMD_OS_ARCH_" in
        x64|x86)    arch_suffix=amd64  ;;
        arm64)      arch_suffix=arm64  ;;
        *)          N=asdf M="Unsupported ARCH: $___X_CMD_OS_ARCH_" log:ret:1 ;;
    esac

    x_="asdf-${version}-${name_suffix}-${arch_suffix}.tar.gz"
}


