# shellcheck shell=dash

# ls --remote == default
# ls --local
# ls --project
# ls --home = claude home, agent home, codex home, gemini home

___x_cmd_skill_ls(){
    local agent=""
    local skilldir_list=""
    local NL="$___X_CMD_UNSEENCHAR_NEWLINE"
    local mode
    if ___x_cmd_runmode_allow_manual; then
        mode=fzapp
    else
        mode=preview
    fi

    while [ "$#" -gt 0 ]; do
        case "$1" in
            -h|--help)     ___x_cmd help -m skill ls; return ;;
            --skill-dir)    [ -n "$2" ] || N=skill M="Please provide the skills dir" log:ret:64
                            skilldir_list="${skilldir_list}${2}${NL}"
                            arg:2:shift ;;
            --agent)        agent="$2";
                            ___x_cmd_skill___agent_check "$agent" || return $?
                            skilldir_list="${skilldir_list}.$agent/skills${NL}$HOME/.$agent/skills${NL}"
                         arg:2:shift ;;
            --id|--fzapp|--preview|--tsv|--csv)
                            mode="${1#--}"; shift ;;
            *)              N=skill M="Unknown option -> $1" log:ret:64 ;;
        esac
    done

    [ -n "$skilldir_list" ] || {
        while read -r agent; do
            skilldir_list="${skilldir_list}.$agent/skills${NL}$HOME/.$agent/skills${NL}"
        done <<A
claude
agents
codex
gemini
openclaw
A
    }
    ___x_cmd_skill_ls___"$mode" "$skilldir_list"
}

___x_cmd_skill_ls___fzapp(){
    local x_=""; ___x_cmd_skill_ls___fzapp_ "$@" || return $?
    skill:info --m:list "$x_" "Selected skill"

    local id=
    ___x_cmd ui select id "Next:"   \
        "rm:    remove the selected skill from the current project" \
        "info:  show index details for the selected skill"          \
        "EXIT"     || return $?

    local x_id=""; local x_dir=""; local x_description=""
    case "$id" in
        1)
            while read -r x_id x_dir x_description; do
                [ -n "$x_id" ] || continue
                if [ "$x_dir" != "${x_dir#"~"}" ]; then
                    x_dir="${HOME}${x_dir#"~"}"
                fi

                ___x_cmd skill rm --skill-dir "$x_dir" "$x_id"
            done <<A
$x_
A
;;
        2)
            while read -r x_id x_dir x_description; do
                [ -n "$x_id" ] || continue
                ___x_cmd skill info "$x_id"
            done <<A
$x_
A
;;
        *)  return 0;;
    esac
}
___x_cmd_skill_ls___fzapp_(){
    local skilldir_list="$1"
    x_="$(
        ___x_cmd_skill_ls___preview_unit "$skilldir_list" | \
            ___x_cmd_skill___fzf  \
            --prompt "[Skills] > " \
            --marker=">>" \
            --preview='___x_cmdexe skill info {1}'  \
            --preview-window='bottom:70%,wrap'      \
            --header="<Tab/Shift-Tab> to multi-select" \
            --height='80%' -m
    )"
    [ -n "$x_" ] || N=skill M="Not selected skills" log:ret:1
}

___x_cmd_skill_ls___preview(){
    local skilldir_list="$1"
    local NO_COLOR="$NO_COLOR"
    if ! ___x_cmd_is_stdout2tty || ! ___x_cmd_runmode_allow_manual; then
        [ -n "$FORCE_COLOR" ] || NO_COLOR=1
    fi

    if [ "$NO_COLOR" != 1 ]; then
        ___x_cmd_skill_ls___preview_unit "$skilldir_list" 1
    else
        ___x_cmd_skill_ls___tsv "$skilldir_list"
    fi
}

___x_cmd_skill_ls___preview_unit(){
    local skilldir_list="$1"
    local has_header="$2"
    ___x_cmd_skill_ls___raw "$skilldir_list" | \
        ___x_cmd_cmds awk -F "$___X_CMD_UNSEENCHAR_HT" -v HOMEDIR="$HOME" -v HAS_HEADER="$has_header" \
            -f "$___X_CMD_ROOT_MOD/skill/lib/awk/ls_preview.awk"
}

___x_cmd_skill_ls___id(){
    local skilldir_list="$1"
    ___x_cmd_skill_ls___raw "$skilldir_list" | {
        local x_id=""; local x_dir=""; local x_description=""
        local IFS="$___X_CMD_UNSEENCHAR_HT"
        while read -r x_id x_dir x_description; do
            [ -n "$x_id" ] || continue
            printf "%s\n" "$x_id"
        done
    }
}

___x_cmd_skill_ls___tsv(){
    printf "%s\t%s\t%s\n" "skill-id" "skill-dir" "description"
    ___x_cmd_skill_ls___raw "$@"
}

___x_cmd_skill_ls___csv(){
    ___x_cmd_skill_ls___tsv "$@" | {
        local x_id=""; local x_dir=""; local x_description=""
        local IFS="$___X_CMD_UNSEENCHAR_HT"
        while read -r x_id x_dir x_description; do
            [ -n "$x_id" ] || continue
            printf "%s,%s,%s\n" "$x_id" "$x_dir" "$x_description"
        done
    }
}

___x_cmd_skill_ls___raw(){
    local skilldir_list="$1"
    local l="";
    while read -r l; do
        [ -n "$l" ] || continue
        ___x_cmd_skill_ls___raw_unit "$l"
    done <<A
$skilldir_list
A
}

___x_cmd_skill_ls___raw_unit(){
    local skilldir="$1";    [ -n "$skilldir" ] || N=skill M="Please provide the skills dir" log:ret:64

    local data; data="$( ___x_cmd find --cmd "$skilldir" -maxdepth 2 -mindepth 2 -type f  -name 'SKILL.md' 2>/dev/null )"
    [ -n "$data" ] || return 1

    local l=""; local x_=""; local skillname=""; local skilldesc=""; local skillid="";
    while read -r l; do
        x_=""; ___x_cmd_skill_util___preview_get_file_desc_ "$l"
        skilldesc="${x_:-"(No description available)"}"

        skillname="${l#"$skilldir/"}"
        skillname="${skillname%"/SKILL.md"}"
        x_=""; ___x_cmd_skill___get_name_or_id --getid-with-name "$skillname"
        skillid="${x_:-$skillname}"

        printf "%s\t%s\t%s\n" "$skillid" "$skilldir" "$skilldesc"
        done <<A
$data
A
}


