# Author:       Li Junhao       l@x-cmd.com
# shellcheck    shell=sh        disable=SC2039,SC1090,SC3043,SC2263

# license:      GPLv3

# Section: Instance management. will be extracted to a file

___x_cmd_instance(){
    local op="${1:?Provide op}"; shift
    case "$1" in
        new|del|has|add|rm|list|clear)
            "___x_cmd_instance_${op}" "$@"
            ;;
        -h|--help) x help -m instance >&2
                   return 1 ;;
        *)  ___x_cmd_instance_list "$@"
            ;;
    esac
}

# TODO: We could use list to replace this facility.
# ___x_cmd_instance_add class object
___x_cmd_instance_new(){
    local name="${2:?Provide object name}"
    name="${name#?}"
    eval "
function $name {
    $1 $2 \"\$@\"
}
"
}

___x_cmd_instance_del(){
    local name="${2:?Provide object name}"
    # TODO:
    if [ $# -gt 2 ];then
        eval "$@"
    fi
    name="${name#?}"
    if command -v "$name" 1>/dev/null 2>&2; then
        unset "$name"
    else
        printf "%s\n" "Instance not found: $O" >&2
        return 1
    fi
}

___x_cmd_instance_has(){
    local class="${1:?Provide class name}"
    local object="${2:?Provide object name}"
    local name="___X_CMD_INSTANCE_$class"
    eval "[ \"\$$name\" != \"\${$name#*@\${object}-*}\" ]"
}

___x_cmd_instance_add(){
    local class="${1:?Provide class name}"
    local object="${2:?Provide object name}"
    local name="___X_CMD_INSTANCE_$class"
    if ! eval "[ \"\$$name\" != \"\${$name#*@\${object}-*}\" ]"; then
        eval "$name=\"\${$name}@\${object}-\""
    else
        printf "%s\n" "Object already enlisted." >&2
        return 1
    fi
}

# ___x_cmd_instance_rm class object
# shellcheck disable=SC2034
___x_cmd_instance_rm(){
    local class="${1:?Provide class name}"
    local object="${2:?Provide object name}"
    local name="___X_CMD_INSTANCE_$class"
    eval "$name=\"\${$name%@\${object}-*}\${$name##*@\${object}-}\""
}

# ___x_cmd_instance_rm class
___x_cmd_instance_list(){
    local class="${1:?Provide class name}"
    local name="___X_CMD_INSTANCE_$class"
    eval "[ -z \"\${$name}\" ]" && return
    eval printf \"%s\" "\"\${$name}\"" | tr "-" "\n" | tr -d @
}

___x_cmd_instance_clear(){
    local class="${1:?Provide class name}"
    local name="___X_CMD_INSTANCE_$class"
    eval "$name="
}

xrc setmain ___x_cmd_instance
