# Author:       Li Junhao           l@x-cmd.com             # xrc
# shellcheck    shell=bash          disable=SC2039,3043,2034,2166

___x_cmd log init advise
xrc:mod:lib     advise  env man
___x_cmd_advise___main(){
    local X_help_cmd; X_help_cmd='___x_cmd help -m advise' help:arg-null:parse
    local op="$1"; shift
    case "$op" in
        gen_advise|gen_x_advise|dev|maxitem|ls|rm|cat|simple|subcmd)
            if ___x_cmd hascmd "___x_cmd_advise_${op}"; then
                "___x_cmd_advise_${op}" "$@"
                return
            fi

            xrc:mod:lib advise  "$op"
            "___x_cmd_advise_${op}" "$@"
            ;;
        which|which_|\
            __rm_bootcode|__get_result_from_awk_|__run_filepath_|\
            __get_mod_advise_jso_|__get_mod_advise_jso|\
            __get_xcmd_advise_util_file_|__load_xcmd_advise_util_file)
            if ___x_cmd hascmd "___x_cmd_advise_${op}"; then
                "___x_cmd_advise_${op}" "$@"
                return
            fi

            xrc:mod:lib advise util.normal
            "___x_cmd_advise_${op}" "$@"
            ;;
        addon)
            xrc:mod:lib advise addon/_index
            ___x_cmd_advise_addon "$@"
            ;;
        man)
            ___x_cmd_advise_"$op" "$@" ;;
        *)  ___x_cmd_advise___entrance "$op" "$@" ;;
    esac
}


if ! ___x_cmd_is_suitable_advise_env; then
    ___x_cmd_advise___entrance(){
        advise:warn "advise completion is not supported in the current environment"
    }
else
    xrc:mod:lib advise  util autoload

    if [ -n "$ZSH_VERSION" ]; then
        xrc:mod advise/lib/main.zsh
    elif [ -n "$BASH_VERSION" ]; then
        [ "${BASH_VERSINFO[0]}" -gt 4 ] || [ "${BASH_VERSINFO[0]}" -eq 4 -a "${BASH_VERSINFO[1]}" -ge 2 ] || ___X_CMD_ADVISE_SHELL_BASH_LT_4_2=1
        xrc:mod advise/lib/main.bash
    fi

    ___x_cmd_advise___entrance(){
        local op="${1}"; [ $# -gt 0 ] && shift
        case "$op" in
            init)       ___x_cmd_advise_init        "$@"    ;;
            complete)   xrc:mod:lib advise complete/_index
                        ___x_cmd_advise_complete    "$@"    ;;
            autoload)   ___x_cmd_advise_autoload    "$@"    ;;
            get_completion_function)
                        ___x_cmd_advise___get_completion_function "$@" ;;
            *)          N=advise M="No such subcmd ==> $op" log:ret:64 ;;
        esac
    }

    ___x_cmd_advise___prepare(){
        if [ -n "$ZSH_VERSION" ]; then
            zstyle ':completion:*:*:*:*:*' menu select
            zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*'
            zstyle ':completion:*' sort false
            if ! command -v compinit > /dev/null; then
                advise:debug "autoload compinit"
                { autoload -Uz compinit && compinit -u; } || return $?
            fi
            ___x_cmd hascmd compdef || {
                advise:debug "Not found command compdef"
                return 1
            }
        elif [ -n "$BASH_VERSION" ]; then
            ___x_cmd hascmd complete || {
                advise:debug "Not found command complete"
                return 1
            }
            bind 'set show-all-if-ambiguous on' || return $?
            ___x_cmd_advise___ltrim_bash_comp_wordbreaks "@" ":" "="
        fi
    }

    ___x_cmd_advise___rcload(){
        if [ -z "${___X_CMD_ADVISE_LOADED}${___X_CMD_ADVISE_PREPARE_FAILED}" ] && ___x_cmd_is_suitable_advise_repl; then
            ___X_CMD_ADVISE_LOADED=1

            if ! ___x_cmd_advise_autoload___eq_never; then
                ___x_cmd_advise___prepare || {
                    ___X_CMD_ADVISE_PREPARE_FAILED=1
                    return 1
                }

                local x_=; ___x_cmd_advise_autoload_get_ || return 0
                case "$x_" in
                    auto)
                        if ___x_cmd_advise_autoload___ifothercompletionloaded; then
                            ___x_cmd_advise_man_load x
                        else
                            if ___x_cmd_is_suitable_advise_completion_env && ___x_cmd_advise_man___folder_exist_completion; then
                                ___x_cmd_advise_man_load completion
                            fi
                            ___x_cmd_advise_man_load x-cmd
                            ___x_cmd_advise_man_load x
                        fi
                        ;;
                    all)
                        ___x_cmd_advise_man_load all
                        ;;
                    x)
                        ___x_cmd_advise_man_load x
                        ;;
                    *)
                        advise:debug "Never load x-cmd advise"
                esac
            fi

            if [ "$___X_CMD_SHELL" = bash ] || [ "$___X_CMD_SHELL" = zsh ]; then
                local addon_codefp="$___X_CMD_ADVISE_ADDON_CHCHE/complete.$___X_CMD_SHELL"
                if [ -f "$addon_codefp" ]; then
                    advise:debug "Load addon completion from $addon_codefp"
                    . "$addon_codefp" || {
                        advise:error "Failed to load addon completion from $addon_codefp"
                        return 1
                    }
                fi
            fi

        fi
    }

    ___x_cmd_advise___rcload || return 0
fi
