# shellcheck shell=dash

# TODO:
# bfind)
#     ___x_cmd advise --"$op" "$cmd" ;;

___x_cmd_coco_toolspec___invoke(){
    local type=yml
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)  ___x_cmd help -m coco toolspec invoke "$@"; return ;;
            --json|--yml|--md)
                        type="${1#--}"; shift ;;
            --*)        N=coco M="Unknown option ==> $1" log:ret:64 ;;
            *)          break ;;
        esac
    done

    local x_=""; ___x_cmd_coco_toolspec___parse_cmdstr_ "$@" || return $?
    eval set -- "$x_"

    local cmd=""
    while [ $# -gt 0 ]; do
        cmd="$1"; shift
        ___x_cmd_coco_toolspec___check "$cmd" || N=coco M="Unknown tool ==> $cmd" log:ret:1
        ___x_cmd_coco_toolspec___invoke_"$type" "$cmd" "$@" || return $?
    done
}

# case "$n" in
#     gg) ___x_cmd gemini --has-apikey 2>/dev/null >&2 || continue ;;
# esac
___x_cmd_coco_toolspec___parse_cmdstr_(){
    if [ "$1" = "all" ]; then
        local i=""; local n=""
        for i in "$___X_CMD_ROOT_MOD/coco/lib/toolspec/data/schema"/*.json; do
            n="${i##*/}"
            n="${n%.json}"
            x_="${x_} ${n}"
        done
        return
    fi

    local cmdstr=""; local cmd=""; local elem=""
    while [ $# -gt 0 ]; do
        cmd="$1"; shift
        elem="${cmd%%,*}"
        cmdstr="${cmdstr} ${elem}"
        while [ "$elem" != "$cmd" ]; do
            cmd="${cmd#*,}"
            elem="${cmd%%,*}"
            cmdstr="${cmdstr} ${elem}"
        done
    done
    [ -n "$cmdstr" ] || N=coco M="Please provide the tool name" log:ret:1
    x_="$cmdstr"
}

___x_cmd_coco_toolspec___invoke_json(){
    local cmd="$1"
    local fp="$___X_CMD_ROOT_MOD/coco/lib/toolspec/data/schema/$cmd.json"
    [ -f "$fp" ] || N=coco M="Not found schema file for $cmd" log:ret:1
    ___x_cmd_cmds cat "$fp"
}

___x_cmd_coco_toolspec___invoke_yml(){
    local data; data="$( ___x_cmd_coco_toolspec___invoke_json "$@" )" || return $?
    ___x_cmd j2y <<A
$data
A
}
