# shellcheck shell=dash

xrc:mod:lib     cfgy    \
    obj/arg             \
    obj/util    obj/cat     obj/rm      \
    obj/get     obj/set     obj/current \
    obj/var     obj/load    obj/init

___x_cmd_cfgy_obj(){
    [ "$#" -gt 0 ] || {
        ___x_cmd_cfgy_help obj >&2
        return 64
    }

    local ___X_CMD_CFGY_OBJ_PREFIX=
    local ___X_CMD_CFGY_OBJ_DEFAULT_CONFIG=
    local ___X_CMD_CFGY_OBJ_CURRENT_CONFIG=
    local ___X_CMD_CFGY_OBJ_CURRENT_PROFILE=
    local ___X_CMD_CFGY_OBJ_VARLIST=
    local ___X_CMD_CFGY_OBJ_VARLISTALL=
    local ___X_CMD_CFGY_OBJ_VARLISTPAT=
    local ___X_CMD_CFGY_OBJ_VARLIST_NOLIMIT=
    while [ $# -gt 0 ]; do
        case "$1" in
            --prefix)
                [ "$#" -ge 2 ] || N=cfgy M="Provide current config" log:ret:64
                ___X_CMD_CFGY_OBJ_PREFIX="$2"
                shift 2; continue ;;

            --default-config)
                [ "$#" -ge 2 ] || N=cfgy M="Provide default config" log:ret:64
                ___X_CMD_CFGY_OBJ_DEFAULT_CONFIG="$2"
                ___x_cmd ensurefp "${___X_CMD_CFGY_OBJ_DEFAULT_CONFIG}"
                shift 2; continue ;;

            --current-config)
                [ "$#" -ge 2 ] || N=cfgy M="Provide current config" log:ret:64
                ___X_CMD_CFGY_OBJ_CURRENT_CONFIG="$2"
                [ -z "$___X_CMD_CFGY_OBJ_CURRENT_CONFIG" ] || {
                    ___x_cmd ensurefp "${___X_CMD_CFGY_OBJ_CURRENT_CONFIG}"
                    x_=; ___x_cmd_abspath_ "$___X_CMD_CFGY_OBJ_CURRENT_CONFIG" || return $?
                    ___X_CMD_CFGY_OBJ_CURRENT_CONFIG="$x_"; x_=
                }
                shift 2; continue ;;

            --current-profile)
                [ "$#" -ge 2 ] || N=cfgy M="Provide current profile" log:ret:64
                ___X_CMD_CFGY_OBJ_CURRENT_PROFILE="$2"
                shift 2; continue ;;

            --nolimit)
                ___X_CMD_CFGY_OBJ_VARLIST_NOLIMIT=1
                shift;  continue ;;

            --varlist)
                [ "$#" -ge 2 ] || N=cfgy M="Provide varlist" log:ret:64
                ___X_CMD_CFGY_OBJ_VARLIST="$2"
                ___X_CMD_CFGY_OBJ_VARLISTALL="config,profile,$___X_CMD_CFGY_OBJ_VARLIST"
                ___X_CMD_CFGY_OBJ_VARLISTPAT=",$___X_CMD_CFGY_OBJ_VARLIST,"
                shift 2; continue ;;
             --help|-h)  ___x_cmd_cfgy_help obj; return ;;
        esac

        [ -n "$___X_CMD_CFGY_OBJ_PREFIX" ] || N=cfgy M="Provide prefix using --prefix" log:ret:64
        [ -n "$___X_CMD_CFGY_OBJ_DEFAULT_CONFIG" ] || N=cfgy M="Provide prefix using --default-config" log:ret:64

        [ -n "$___X_CMD_CFGY_OBJ_CURRENT_CONFIG" ] ||
            eval "___X_CMD_CFGY_OBJ_CURRENT_CONFIG=\"\$${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_config\""

        [ -n "$___X_CMD_CFGY_OBJ_CURRENT_PROFILE" ] ||
            eval "___X_CMD_CFGY_OBJ_CURRENT_PROFILE=\"\$${___X_CMD_CFGY_OBJ_PREFIX}_CURRENT_profile\""

        # cfgy:debug --___X_CMD_CFGY_OBJ_CURRENT_CONFIG "$___X_CMD_CFGY_OBJ_CURRENT_CONFIG" --___X_CMD_CFGY_OBJ_CURRENT_PROFILE "$___X_CMD_CFGY_OBJ_CURRENT_PROFILE" obj

        case "$1" in
            ls|print|\
            load|unload|reload|isloaded|\
            rm|clear|cat|current|\
            parse|get_|get|var|set|unset|init)
                local op="$1"; shift;   ___x_cmd_cfgy_obj_"$op" "$@";
                return ;;

            --ls|--print|\
            --load|--unload|--reload|--isloaded|\
            --rm|--clear|--cat|--current|\
            --parse|--get_|--get|--var|--set|--unset|--init)
                local op="${1#--}"; shift;   ___x_cmd_cfgy_obj_"$op" "$@";
                return ;;

            *=*)
                ___x_cmd_cfgy_obj_set "$@"
                return ;;
            *,*)
                ___x_cmd_cfgy_obj_print "$@"
                return ;;
            *)  N=cfgy M="Unknown subcmd $1" log:ret:64
        esac
    done
}


___x_cmd_cfgy_obj___hasvar(){
    [ -z "$___X_CMD_CFGY_OBJ_VARLIST_NOLIMIT" ] || return 0
    [ "${___X_CMD_CFGY_OBJ_VARLISTPAT#*,"$1",}" != "$___X_CMD_CFGY_OBJ_VARLISTPAT" ]
}

___x_cmd_cfgy_obj_print(){
    [ "$#" -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_get_ "$var" || return $?
        printf "%s=%s\n" "$var" "$x_"
    done
}

___x_cmd_cfgy_obj_ls(){
    ___x_cmd_cfgy_obj_print "$@"
}
