# shellcheck shell=dash

___X_CMD_MAN_ALL_CACHE="$___X_CMD_ROOT_CACHE/man/all.cache"

___x_cmd_man___all(){
    if [ ! -f "$___X_CMD_MAN_ALL_CACHE" ]; then
        ___x_cmd_man___all_build
    fi
    ___x_cmd_cmds cat "$___X_CMD_MAN_ALL_CACHE"
}

___x_cmd_man___all_build(){
    x ensurefp "$___X_CMD_MAN_ALL_CACHE"
    ___x_cmd_man___all_update | sort | uniq > "$___X_CMD_MAN_ALL_CACHE"
}

___x_cmd_man___all_update(){
    ___x_cmd_man_path___ls | {
        local line
        while read -r line; do
            [ -d "$line" ] || continue
            ___x_cmd_cmds find "$line" -type f
        done
    } | {
        local line
        local cmd
        while read -r line; do
            line="${line##*/}"
            line="${line%.gz}"
            line="${line%.xz}"
            line="${line%.zstd}"

            cmd="${line%.*}"
            line="${line#"$cmd".}"
            line="${line%"${line#?}"}"

            printf "%s %s\n" "$line" "$cmd"
        done
    }
}

___x_cmd_man_path___ls(){
    local data;
    data="$(___x_cmd_cmds manpath)"
    [ -n "$data" ] || data="$MANPATH"
    [ -n "$data" ] || data="/usr/share/man"

    MANPATH="$data" ___x_cmd_man_path___ls_native
}

case "$___X_CMD_SHELL" in
    dash)
___x_cmd_man_path___ls_native(){
    local IFS=:
    local p; for p in $MANPATH; do
        printf "%s\n" "$p"
    done
}
    ;;
    *)
___x_cmd_man_path___ls_native(){
    printf "%s\n" "${MANPATH//:/
}"
}
esac
