# shellcheck shell=dash

___x_cmd_ondb_related(){
    local id="" rel="" direction="outgoing" dir="" fmt="tsv"

    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)  ___x_cmd help -m ondb related "$@" ; return 0 ;;
            --id)       id="$2"; arg:2:shift ;;
            --rel)      rel="$2"; arg:2:shift ;;
            --direction) direction="$2"; arg:2:shift ;;
            --datadir|-d)   dir="$2"; arg:2:shift ;;
            --tsv)      fmt="tsv"; shift ;;
            --json)     fmt="json"; shift ;;
            --)         shift; break ;;
            *)          break ;;
        esac
    done

    [ -n "$id" ] || { N=ondb M="--id is required" log:ret:64; return; }

    # SQLite path
    ___x_cmd_ondb_db_path "$dir"
    if [ -n "$x_" ]; then
        local db="$x_" relfilter="" eid="$id" erel="$rel"
        ___x_cmd_ondb_db_esc eid; ___x_cmd_ondb_db_esc erel
        [ -n "$rel" ] && relfilter=" AND l.rel='$erel'"

        if [ "$direction" = "outgoing" ]; then
            sqlite3 -separator '	' "$db" "
                SELECT l.rel, e.id, e.type,
                    COALESCE((SELECT group_concat(p.key || '=' || p.value, char(9))
                              FROM props p WHERE p.entity_id=e.id), '')
                FROM links l JOIN entities e ON e.id=l.to_id
                WHERE l.from_id='$eid'${relfilter};"
        elif [ "$direction" = "incoming" ]; then
            sqlite3 -separator '	' "$db" "
                SELECT l.rel, e.id, e.type,
                    COALESCE((SELECT group_concat(p.key || '=' || p.value, char(9))
                              FROM props p WHERE p.entity_id=e.id), '')
                FROM links l JOIN entities e ON e.id=l.from_id
                WHERE l.to_id='$eid'${relfilter};"
        else
            sqlite3 -separator '	' "$db" "
                SELECT CASE WHEN l.from_id='$eid' THEN 'out' ELSE 'in' END,
                    l.rel,
                    CASE WHEN l.from_id='$eid' THEN l.to_id ELSE l.from_id END,
                    CASE WHEN l.from_id='$eid' THEN (SELECT e2.type FROM entities e2 WHERE e2.id=l.to_id) ELSE (SELECT e2.type FROM entities e2 WHERE e2.id=l.from_id) END,
                    COALESCE((SELECT group_concat(p.key || '=' || p.value, char(9)) FROM props p WHERE p.entity_id=CASE WHEN l.from_id='$eid' THEN l.to_id ELSE l.from_id END), '')
                FROM links l WHERE (l.from_id='$eid' OR l.to_id='$eid')${relfilter};"
        fi
        return
    fi

    # AWK fallback
    local input
    if [ -n "$dir" ]; then
        ___x_cmd_ondb_logpath_read "$dir"
        input="$x_"
    else
        input="cat 'ondb.tsv'"
    fi

    eval "$input" | ___x_cmd_ondb_cawk related \
        -v ONTO_ID="$id" -v ONTO_REL="${rel:-}" -v ONTO_DIR="$direction" -v ONTO_FMT="$fmt"
}
