# shellcheck shell=dash disable=2142

___x_cmd_llmf___prepare_model_mmproj(){
    local x_
    [ -n "$model" ] || {
        x_=; ___x_cmd_llmf_model_default get_
        model="$x_"
    }

    [ -n "$model" ]  || N=llmf M="No model specified" log:ret:64

    [ -f "$model" ] || {
        ___x_cmd_llmf___model_confirm "$model"          || return $?
        ___x_cmd_llmf_model_exist "$model" \
            || ___x_cmd_llmf_model_download "$model"    || return $?
        ___x_cmd_llmf_model_which_ "$model"             || return $?
        model="$x_"
    }

    x_=; ___x_cmd_llmf___model2mmproj_ "$model" "$mmproj"
    mmproj="$x_"
    [ -z "$mmproj" ] || {
        [ -f "$mmproj" ] || {
            ___x_cmd_llmf___model_confirm "$mmproj"          || return $?
            ___x_cmd_llmf_model_exist "$mmproj" \
                || ___x_cmd_llmf_model_download "$mmproj"    || return $?
            ___x_cmd_llmf_model_which_ "$mmproj"             || return $?
            mmproj="$x_"
        }

    }
    llmf:debug --model "$model" --mmproj "${mmproj:-"undefined"}"
}

alias llmf:prepare:model:mmproj='
    ___x_cmd_llmf___prepare_model_mmproj || return $?
'

___x_cmd_llmf___model2mmproj_(){
    local model="$1"
    local mmproj="$2"

    [ -z "$mmproj" ] || {
        x_="$mmproj"
        return 0
    }

    x_=

    case "$model" in
        *.llamafile)    x_=""   ;;
        *.gguf)         x_="$(model="${model#"$___X_CMD_LLMF_MODEL_DATA_CACHE"/}" dirpath="$___X_CMD_LLMF_MODEL_DATA_INFO" ___x_cmd cawk -m j/json,j/jiter \
                            -f "$___X_CMD_ROOT_MOD/llmf/lib/awk/model2mmproj.awk")" || true
                        ;;
    esac
}

___x_cmd_llmf___model2hf_(){
    local model="$1"
    local model_name="${model%%/*}"

    ___x_cmd_llmf___prepare_metadata || return $?
    local fp="$___X_CMD_LLMF_MODEL_DATA_INFO/${model_name}.json"
    [ -f "$fp" ] || N=llmf M="Not found such [model=$model]" log:ret:1

    x_="$( model="$model" dirpath="$___X_CMD_LLMF_MODEL_DATA_INFO" ___x_cmd cawk -m j/json,j/jiter \
        -f "$___X_CMD_ROOT_MOD/llmf/lib/awk/model2hf.awk" )" || true
    [ -n "$x_" ] || N=llmf M="The [model=$model] does not exist or the data parsing is abnormal" log:ret:1
}

___x_cmd_llmf___prepare_metadata(){
    [ -d "$___X_CMD_LLMF_MODEL_DATA_INFO" ] || ___x_cmd pkg update
}

___x_cmd_llmf___model_list(){
    local tmpfile="$___X_CMD_ROOT_TMP/llmf/model_name_list"
    ___x_cmd_llmf___prepare_metadata || return $?
    [ "$tmpfile" -nt "$___X_CMD_LLMF_MODEL_DATA_INFO" ] || {
        ___x_cmd ensurefp "$tmpfile"
        ___x_cmd_llmf_model_ls___csv --all | ___x_cmd csv awk -f "$___X_CMD_ROOT_MOD/llmf/lib/awk/model.list.awk" > "$tmpfile"
    }
    ___x_cmd_cmds_cat "$tmpfile"
}

___x_cmd_llmf___model_confirm(){
    local model="$1"
    while read -r l; do
        [ "$l" != "$model" ] || return 0
    done << A
$( ___x_cmd_llmf___model_list )
A
    llmf:warn "The [model=$model] is not supported"
    return 1
}
