# shellcheck shell=dash

___x_cmd_cfgy_obj_current(){
    local op="$1"; [ "$#" -le 0 ] || shift
    #TODO: let ?
    case "$op" in
        "")            ___x_cmd_cfgy_obj_current_ls ;;
        let|get|get_|getor|getor_|print|set|unset|import|\
        ls|lsi|clear)
                        ___x_cmd_cfgy_obj_current_"$op"     "$@" ;;

        --let|--get|--get_|--getor|--getor_|--print|--set|--unset|--import|\
        --ls|--lsi|--clear)
                        op="${op#--}"
                        ___x_cmd_cfgy_obj_current_"$op"     "$@" ;;

        *,*)            ___x_cmd_cfgy_obj_current_print     "$op" ;;
        *:=*)           ___x_cmd_cfgy_obj_current_import    "$op" "$@" ;;
        *=*)            ___x_cmd_cfgy_obj_current_set       "$op" "$@" ;;
        *_)             ___x_cmd_cfgy_obj_current_get_ "${op%_}" ;;
        --help|-h)      ___x_cmd_cfgy_help obj --current ;;
        *)              N=cfgy M="Unknown command ==> $op" log:ret:64
                        return 1 ;;
    esac
}

___x_cmd_cfgy_obj_current_get(){
    local x_=""
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --get}"
    ___x_cmd_cfgy_obj_current_get_ "$@" || return $?
    printf "%s\n" "$x_"
}

___x_cmd_cfgy_obj_current_get_config_(){
    x_="${___X_CMD_CFGY_OBJ_CURRENT_CONFIG:-$___X_CMD_CFGY_OBJ_DEFAULT_CONFIG}"
}

___x_cmd_cfgy_obj_current_get_profile_(){
    # x_="${___X_CMD_CFGY_OBJ_CURRENT_PROFILE}"
    # [ -n "$x_" ] || ___x_cmd_cfgy_obj_get_ profile
    x_="${___X_CMD_CFGY_OBJ_CURRENT_PROFILE:-X}"
}

___x_cmd_cfgy_obj_current_get_(){
    local var="$1";
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --get_}"
    help:arg-null:parse
    x_=""
    case "$var" in
        config)     ___x_cmd_cfgy_obj_current_get_config_;  return ;;
        profile)    ___x_cmd_cfgy_obj_current_get_profile_; return ;;
    esac

    local X_cfgy_varname="$var"; cfgy:check:varname
    [ -z "$var" ]   || eval x_=\"\$"${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_${var}"\"
    [ -z "$x_" ]    || return 0
    # TODO: In the config-disable mode, no config is loaded, so we return the environment defined using current
    ___x_cmd_cfgy_obj_get_ "$var"
}

___x_cmd_cfgy_obj_current_getor_(){
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --getor_}"
    help:arg:parse
    ___x_cmd_cfgy_obj_current_get_ "$1" || x_="$2"
}

___x_cmd_cfgy_obj_current_getor(){
    local x_=""
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --getor}"
    help:arg:parse
    ___x_cmd_cfgy_obj_current_getor_ "$@"
    printf "%s\n" "$x_"
}

# shellcheck disable=SC2034
___x_cmd_cfgy_obj_current_set(){
    local var
    local val
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --set}"
    help:arg-null:parse
    local X_cfgy_varname=
    # TODO: there is a better but more complex way to invoke eval just once
    while [ $# -gt 0 ]; do
        case "$1" in
            *=*)    var="${1%%=*}"              val="${1#*=}";  shift ;;
            *)      var="$1"
                    if [ $# -lt 2 ]; then       val=;           shift
                    else                        val="$2";       shift 2
                    fi ;;
        esac

        case "$var" in
            config)     eval "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_config=\"\$val\""     ;;
            profile)    eval "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_profile=\"\$val\""    ;;
            *)
                        X_cfgy_varname="$var" cfgy:check:varname
                        eval "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_${var}=\"\$val\""
        esac
    done
}

___x_cmd_cfgy_obj_current_unset(){
    local var
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --unset}"
    help:arg-null:parse
    local X_cfgy_varname=
    while [ $# -gt 0 ]; do
        var="$1"; shift
        case "$var" in
            config)     unset "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_config"     ;;
            profile)    unset "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_profile"    ;;
            *)
                        X_cfgy_varname="$var" cfgy:check:varname
                        unset "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_${var}"
        esac
    done
}

___x_cmd_cfgy_obj_current_import(){
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --import}"
    help:arg-null:parse
    local X_cfgy_varname=
    while [ $# -gt 0 ]; do
        local newvar="${1%%:=*}";   local var="${1#*:=}";   shift
        [ -n "$var" ] || var="$newvar"
        case "$var" in
            config|profile)     ;;
            *)                  X_cfgy_varname="$var" cfgy:check:varname
        esac

        local x_=""
        ___x_cmd_cfgy_obj_current_get_ "$var" || continue
        eval "${newvar}=\"\$x_\""
    done
}

# If it is ignore, then we should provide a list...
___x_cmd_cfgy_obj_current_print(){
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --print}"
    help:arg:parse
    [ "$#" -gt 0 ] || {
        # TODO: print config and profile first
        set -- "$___X_CMD_CFGY_OBJ_VARLISTALL"
    }
    local x_=""; local var=""; local item="$1"
    while [ "$var" != "$item" ]; do
        var="${item%%,*}"
        item="${item#*,}"
        [ "$var" != "" ] || continue
        x_=""
        ___x_cmd_cfgy_obj_current_get_ "$var" || continue
        printf "%s=%s\n" "$var" "$x_"
    done
}

___x_cmd_cfgy_obj_current_ls(){
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --ls}"
    help:arg:parse
    ___x_cmd_cfgy_obj_current_print
}

# TODO: Add profile handling
___x_cmd_cfgy_obj_current_clear(){
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --clear}"
    help:arg:parse
    local x_=""; local var=""; local item="$___X_CMD_CFGY_OBJ_VARLISTALL"
    while [ "$var" != "$item" ]; do
        var="${item%%,*}"
        item="${item#*,}"
        x_="${x_}${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_${var}=
"
    done
    eval "$x_"
}

# For debug
___x_cmd_cfgy_obj_current_lsi(){
    local X_help_cmd="${X_help_cmd:-x help -m cfgy obj --current --lsi}"
    help:arg:parse
    local x_=""; local var=""; local item="$___X_CMD_CFGY_OBJ_VARLISTALL"
    while [ "$var" != "$item" ]; do
        var="${item%%,*}"
        item="${item#*,}"
        [ "$var" != "" ] || continue
        x_=""
        ___x_cmd_cfgy_obj_current_get_ "$var" || continue
        printf "%s=%s\n" "${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_${var}" "$x_"
    done
}

# Deprecated ...
# ___x_cmd_cfgy_obj_current_getorfail_(){
#     ___x_cmd_cfgy_obj_current_get_ "$@" || {
#         # TODO: Add more logs: chat:error "Fail to fetch apikey. Please set apikey using 'x chat <$1>=<val>'."
#         cfgy:error "Fail to fetch $1. Please set $1 first."
#         return 1
#     }
# }

# ___x_cmd_cfgy_obj_current_initenv(){
#     local mod=
#     while [ $# -gt 0 ]; do
#         case "$1" in
#             --mod)
#                 mod="$2"; shift 2
#                 ;;
#             *)
#                 break
#         esac
#     done

#     local PREFIX="___x_cmd_cfgy_current_$mod"

#     [ -n "$PREFIX" ] || N=cfgy M="Provide current initenv prefix"   log:ret:64

#     while [ $# -gt 0 ]; do
#         local varname="${PREFIX}_$1"; shift
#         eval "${PREFIX}_CODE_LS=\"\${${PREFIX}_CODE_CLEAR}printf \"%s\n\" ${varname}
# \""
#         eval "${PREFIX}_CODE_CLEAR=\"\${${PREFIX}_CODE_CLEAR}${varname}=
# \""
#     done

#     # set the code to reset and ls
#     # also set the code to init the env

# }


# x chat proxy set --save
# x cfgy obj current set X_CHAT_PROXY proxy --save sock://

# generate code
# gen
# ___x_cmd_cfgy_obj_current_set(){
#     local envvarname="$1";
#     local key="$2";         shift 2
#     [ -n "$envvarname" ]    || N=cfgy M="Provide current env varname"   log:ret:64
#     [ -n "$key" ]           || N=cfgy M="Provide current key"           log:ret:64

#     local _save=""
#     case "$1" in
#         --save|-s)  _save=1; shift ;;
#     esac

#     [ -z "$_save" ] || ___x_cmd_cfgy_obj_set "$key=$1"
#     eval "$envvarname=\"\$1\""
# }

# ___x_cmd_cfgy_obj_current_getset(){
#     local envvarname="$1"
#     local key="$2"
#     [ -n "$envvarname" ]    || N=cfgy M="Provide current env varname"   log:ret:64
#     [ -n "$key" ]           || N=cfgy M="Provide current key"           log:ret:64
#     shift 2
#     if [ $# -eq 0 ]; then   ___x_cmd_cfgy_obj_current_get "$envvarname" "$key"
#     else                    ___x_cmd_cfgy_obj_current_set "$envvarname" "$key"  "$@"
#     fi
# }
