# shellcheck shell=dash

___X_CMD_ABOX_PREFIX="abox-"
___X_CMD_ABOX_HOME="$HOME/.x-home"

___x_cmd_abox___normalize_name_(){
    local name="${1:-}"
    [ -n "$name" ]  ||  {
        x_="${___X_CMD_ABOX_PREFIX}0"
        abox:debug "Using default name -> $x_"
        return 0
    }

    case "$name" in
        "${___X_CMD_ABOX_PREFIX}"*)    x_="$name" ;;
        *)              x_="${___X_CMD_ABOX_PREFIX}${name}"
                        abox:debug "Using name -> $x_" ;;
    esac
}

___x_cmd_abox_stop(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox stop "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$1" || return $?
    local name="$x_"

    ___x_cmd docker stop "$name"
}

___x_cmd_abox_restart(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox restart "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$1" || return $?
    local name="$x_"

    ___x_cmd docker restart "$name"
}

___x_cmd_abox_pause(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox pause "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$1" || return $?
    local name="$x_"

    ___x_cmd docker pause "$name"
}

___x_cmd_abox_resume(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox resume "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$1" || return $?
    local name="$x_"

    ___x_cmd docker unpause "$name"
}

___x_cmd_abox_login(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox login "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$1" || return $?
    local name="$x_"

    ___x_cmd docker exec "$name" bash
}

___x_cmd_abox_cmd(){
    local name=""
    local rootmode=""
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox cmd "$@" ; return 0 ;;
            -n|--name)      name="$2";      arg:2:shift ;;
            -r|--root)      rootmode=1;     shift ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$name" || return $?
    name="$x_"

    [ $# -gt 0 ]    ||  set -- bash

    if [ -n "$rootmode" ]; then
        ___x_cmd docker exec --user root    "$name" "$@"
    else
        ___x_cmd docker exec                "$name" "$@"
    fi
}

___x_cmd_abox_cmdi(){
    local name=""
    local rootmode=""
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox cmdi "$@" ; return 0 ;;
            -n|--name)      name="$2";      arg:2:shift ;;
            -r|--root)      rootmode=1;     shift ;;
            *)              break ;;
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$name" || return $?
    name="$x_"

    [ $# -gt 0 ]    ||  set -- bash

    if [ -n "$rootmode" ]; then
        ___x_cmd docker exec -it --user root    "$name" "$@"
    else
        ___x_cmd docker exec -it                "$name" "$@"
    fi
}

# x abox run -> open a tmux session. Then
# TODO: This should be promoted as standard function in docker.

___x_cmd_abox_tmux(){
    local name=""
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)  ___x_cmd help -m abox tmux "$@" ; return 0 ;;

            -n|--name)  name="$2" ; arg:2:shift ;;

            :*)         name=0
                        break
                        ;;

            *:*)        name="${1%:*}"
                        set -- ":${1#*:}"
                        break
                        ;;
            *)          break
        esac
    done

    local x_=
    ___x_cmd_abox___normalize_name_ "$name" || return $?
    name="$x_"

    ___x_cmd docker exec -it "$name" x-cmd tmux "$@"
}

___x_cmd_abox_ls(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox ls "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    ___x_cmd docker ps --prefix "$___X_CMD_ABOX_PREFIX"     "$@"
}

___x_cmd_abox_fz(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox fz "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    ___X_CMD_DOCKER_IMAGE_PREFIX="$___X_CMD_ABOX_PREFIX"     \
    ___x_cmd docker fz --prefix "$___X_CMD_ABOX_PREFIX"     "$@"
}

___x_cmd_abox_rm(){
    local name=""
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox cmdi "$@" ; return 0 ;;
            -n|--name)      name="$2";      arg:2:shift ;;
            *)              break ;;
        esac
    done

    if [ $# -gt 0 ]; then
        name="$1" ; shift
    fi

    local x_=
    ___x_cmd_abox___normalize_name_ "$name" || return $?
    name="$x_"

    ___x_cmd docker rm -f "$name"
}

___x_cmd_abox_clearall(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox clearall "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    ___x_cmd docker stop --prefix "$___X_CMD_ABOX_PREFIX"
    ___x_cmd docker rm --prefix "$___X_CMD_ABOX_PREFIX"
    ___x_cmd docker image rm --prefix "${___X_CMD_ABOX_PREFIX%-}" 2>/dev/null || abox:info "Image abox not found or already removed"

    abox:info "Done."
}

___x_cmd_abox_home(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m abox home "$@" ; return 0 ;;
            *)              break ;;
        esac
    done

    printf "%s\n" "$___X_CMD_ABOX_HOME"
}

