# shellcheck shell=dash

xrc:mod:lib advise  addon/carapace

___x_cmd_advise_addon(){
    local op="$1"
    case "$op" in
        use|unuse|get)
                    shift; ___x_cmd_advise_addon_"${op}" "$@" ;;
        -h|--help)  ___x_cmd help -m advise addon;      return ;;
        *)          ___x_cmd help -m advise addon >&2;  return 64 ;;
    esac
}

___x_cmd_advise_addon_use(){
    local provider="$1";
    case "$provider" in
        carapace)   ___x_cmd_advise_addon_carapace___check || return $? ;;
        -h|--help)  ___x_cmd help -m advise addon use; return ;;
        '')         ___x_cmd help -m advise addon use >&2; return 64 ;;
        *)          N=advise M="Unknown [provider=$provider]" log:ret:64 ;;
    esac

    ___x_cmd_advise_addon_use___compile_all "$provider"
}

___x_cmd_advise_addon_use___compile_all(){
    local provider="$1"
    local shellname
    for shellname in bash zsh fish elvish nu tcsh xonsh powershell; do
        ___x_cmd_advise_addon_use___compile_shellfile "$provider" "$shellname" || return $?
    done
    printf "%s\n" "$provider" > "$___X_CMD_ADVISE_ADDON_CHCHE/provider"
    advise:info "Compiled [provider=$provider] complete code into all supported shell scripts"
    advise:info "To apply the configuration, please reopen a new shell environment"
}

___x_cmd_advise_addon_use___compile_shellfile(){
    local provider="$1"
    local compile_shellname="$2"
    local suffix="$compile_shellname"
    case "$compile_shellname" in
        elvish)     suffix="elv" ;;
        pwsh)       suffix="ps1" ;;
        xonsh)      suffix="xsh" ;;
        powershell) suffix="ps1" ;;
        *) ;;
    esac

    local codefp="$___X_CMD_ADVISE_ADDON_CHCHE/complete.$suffix"
    ___x_cmd ensurefp "$codefp"
    if [ "$provider" = "carapace" ]; then
        ___x_cmd_advise_addon_carapace___compile_code "$compile_shellname" > "$codefp"
    fi
}

___x_cmd_advise_addon_unuse(){
    case "$1" in
        -h|--help) ___x_cmd help -m advise addon unuse; return ;;
    esac

    local fp="$___X_CMD_ADVISE_ADDON_CHCHE/provider"
    if [ ! -f "$fp" ]; then
        advise:info "No external completion provider used"
    else
        for fp in "$___X_CMD_ADVISE_ADDON_CHCHE"/*; do
            if [ "$fp" = "${fp%".nu"}" ]; then
                ___x_cmd rmrf "$fp"
            else
                printf "" > "$fp"
            fi
        done
        advise:info "Successfully unuse external completion provider"
        advise:info "To apply the configuration, please reopen a new shell environment"
    fi
}

___x_cmd_advise_addon_get_(){
    local fp="$___X_CMD_ADVISE_ADDON_CHCHE/provider"
    [ -f "$fp" ] || return 1
    read -r x_ < "$fp"
}

___x_cmd_advise_addon_get(){
    local x_=""; ___x_cmd_advise_addon_get_ || return $?
    printf "%s\n" "$x_"
}
