# shellcheck shell=dash

___x_cmd_skill_cat(){
    local skillid="$1"
    [ -n "$skillid" ] || N=skill M="Please provide the skill id" log:ret:64
    local x_=; ___x_cmd_skill_which_ "$skillid" "SKILL.md" || return $?
    skill:info "cat $x_"
    ___x_cmd_cmds cat "$x_"
}

___x_cmd_skill_which(){
    local x_=; ___x_cmd_skill_which_ "$@" || return $?
    printf "%s\n" "$x_"
}

___x_cmd_skill_which_(){
    local skillid="$1"; [ -n "$skillid" ] || N=skill M="Please provide the skill id" log:ret:64
    local filename="$2"

    x_="$___X_CMD_SKILL_FULL_DATA_DIR/$skillid/$filename"
    [ -e "$x_" ] || N=skill M="Not found skill file -> $x_" log:ret:1
}

___x_cmd_skill_info(){
    local skillid="${1}"; [ -n "$skillid" ] || N=skill M="Please provide the skill id" log:ret:64
    case "$skillid" in
        x-mod/*)    ___x_cmd_skill_lr___xcmd___generate_modskill "${skillid#*x-mod/}"  ;;
        clawhub/*)  ___x_cmd clawhub skill file "${skillid#*clawhub/}" --filepath SKILL.md ;;
        *)          ___x_cmd cat "$___X_CMD_SKILL_FULL_INDEX_FILE" | ___x_cmd_cmds awk -F'\t' -v id="$skillid" -f "$___X_CMD_ROOT_MOD/skill/lib/awk/info.awk"
    esac
}

___x_cmd_skill___get_name_or_id(){
    local check=name
    case $1 in
        --getname-with-id) check=id;    shift ;;
        --getid-with-name) check=name;  shift ;;
        *) ;;
    esac

    local key="$1";         [ -n "$key" ] || N=skill M="Please provide the key value" log:ret:64
    local indexlist="$___X_CMD_SKILL_FULL_INDEX_FILE"
    [ -f "$indexlist" ] || return 1
    x_=""
    local x_id=""; local x_name=""; local _
    local IFS="$___X_CMD_UNSEENCHAR_HT"
    while read -r x_id _ _ _ x_name _ _; do
        [ "$x_id" = "id" ] && continue

        if [ "$check" = "id" ]; then
            if [ "$x_id" = "$key" ]; then
                x_="$x_name"
                break
            fi
        else
            if [ "$x_name" = "$key" ]; then
                x_="$x_id"
                break
            fi
        fi
    done < "$indexlist"
    [ -n "$x_" ]
}

___x_cmd_skill___agent_check(){
    local agent="$1"
    case "$agent" in
        claude|codex|gemini|kimi|opencode|openclaw)
            return 0 ;;
        "") skill:error "Please provide the agent name -> [claude|codex|gemini|kimi|opencode|openclaw]"
            return 64 ;;
        *)  skill:error "Unknown agent -> $agent, supports only [claude|codex|gemini|kimi|opencode|openclaw]"
            return 1 ;;
    esac
}

___x_cmd_skill___fzf(){
    FZF_DEFAULT_OPTS="
--ansi
--reverse
--bind='ctrl-w:toggle-preview-wrap'
--bind='ctrl-r:change-preview-window(right,70%|down,40%,99%,border-horizontal|hidden|right)'
"   ___x_cmd fzf "$@"
}

___x_cmd_skill___util_find_up_(){
    local dir="$1"; shift
    [ -d "$dir" ] || return 1
    [ "$dir" != "/" ] || return 1

    x_=""; ___x_cmd abspath_ "$dir" || return 1
    dir="$x_";

    local uplist=""
    x_=""; ! ___x_cmd_skill___util_find_up_ "${dir%/*}" "$@" || uplist="$x_"
    local fp=""
    local NL="$___X_CMD_UNSEENCHAR_NEWLINE"
    x_="$NL"
    while [ "$#" -gt 0 ]; do
        fp="$dir/$1"; shift
        if [ -f "$fp" ]; then
            [ "$x_" = "${x_#*"${NL}${fp}${NL}"}" ] || continue
            x_="${x_}${fp}${NL}"
        fi
    done
    x_="${x_}${uplist}"
    x_="${x_#"$NL"}"
    x_="${x_%"$NL"}"
    [ -n "$x_" ]
}

___x_cmd_skill___util_select_agent_(){
    if ! ___x_cmd_runmode_allow_manual; then
        return 1
    else
        x_=; ___x_cmd storeread_ ___x_cmd pick --ask "Select the agent to use" --ctrl-c-clear <<A
claude
codex
gemini
A
    fi
}

___x_cmd_skill_util___preview_get_file_desc_(){
    local skillfile="$1"
    [ -f "$skillfile" ] || return 1
    local n=0; local l=""; local desc=""
    x_=""
    while read -r l; do
        desc="${l#"description: "}"
        [ "$l" = "$desc" ] || {
            case "$desc" in
                \|*|\>*)
                    # YAML block scalar: read subsequent indented lines
                    x_=""
                    while IFS= read -r l; do
                        [ "$l" = "---" ] && break
                        [ -n "$l" ] || continue
                        case "$l" in
                            " "*|"	"*)
                                l="${l#"${l%%[! 	]*}"}"
                                [ -n "$x_" ] && x_="$x_ $l" || x_="$l"
                                ;;
                            *)  break ;;
                        esac
                    done
                    ;;
                *)  x_="$desc" ;;
            esac
            break
        }
        n=$(( n + 1 ))
        [ "$n" -le 10 ] || break
    done < "$skillfile"
    [ -n "$x_" ]
}
