# shellcheck shell=dash

# x boot ch beta  == x boot ch beta bash
# x boot ch  ==  x boot ch alpha bash
# x boot ch [version] [sh] [...args]

# x boot ch --image ubnutu:latest --version v0.1.5 bash
# x boot ch --version v0.1.5 bash

___x_cmd_boot_ch(){
    local version="$___X_CMD_VERSION"
    local user=""
    while [ $# -gt 0 ]; do
        case "$1" in
            --version)
                [ -n "$2" ] || N=boot M="Provide version" log:ret:64
                version="$2"
                shift 2
                ;;
            --user)
                [ -n "$2" ] || N=boot M="Provide user" log:ret:64
                user="$2"
                shift 2
                ;;
            *)
                break
                ;;
        esac
    done

    [ $# -ne 0 ] || set -- alpha
    local version="$1"; shift
    [ $# -ne 0 ] || set -- "$SHELL"

    boot:debug --version "$version" --exec "$*"
    [ -d "$___X_CMD_ROOT/v/$version" ] || {
        ___x_cmd_boot_ch___install "$version" || return $?
    }

    ___X_CMD_ROOT_CODE="" \
    ___X_CMD_VERSION="$version" "$@"
}

___x_cmd_boot_ch___install(){
    local version="$1"
    local code_dir="$___X_CMD_ROOT/v/$version"
    ___x_cmd rmrf "$code_dir"
    case "$version" in
        latest|alpha|beta)
                {
                    local cache="$___X_CMD_ROOT_TMP/$version.tgz"
                    ___x_cmd httpget gitx x-cmd release main "dist/$version.tgz" "$cache" - || return $?
                    ___x_cmd mkdirp "$code_dir"
                    ___x_cmd uz "$cache" "$code_dir" || return $?
                } || {
                    boot:error "Fail to download or unpack $version.tgz from x-cmd/release"
                    ___x_cmd rmrf "$code_dir"
                    return 1
                }
                ;;
        x[0-9]|x-cmd/*)
                local repo="${version%/*}"
                local branch=main;  [ "$repo" = "$version" ] || branch="${version#*/}"
                local ___X_CMD_WEBSRC_GITDOMAIN_;   ___x_cmd websrc gitdomain_
                (
                    ___x_cmd mkdirp "$code_dir"
                    ___x_cmd_inner_cd "$___X_CMD_ROOT/v"
                    boot:info git clone "git@$___X_CMD_WEBSRC_GITDOMAIN_:x-cmd/$repo.git" -b "$branch" "$version"
                    command git clone "git@$___X_CMD_WEBSRC_GITDOMAIN_:x-cmd/$repo.git" -b "$branch" "$version"
                ) || {
                    boot:error "Fail to git clone x-cmd/$repo $branch"
                    ___x_cmd rmrf "$code_dir"
                    return 1
                }
                ;;

        *)      M="Version $version does not exist" N=boot log:ret:64 ;;
    esac
    boot:info "Success to download x-cmd $version"
}
