#!/usr/bin/env bash
###############################################################################
# dsnip — Bookmark launcher: category browse + full-text search via dmenu
#
# DB: ~/.local/share/karbs/bookmarks.db
# Usage:
#   dsnip          — open launcher
#   dsnip-seed     — import legacy snippets file (run once)
#   bm add         — add a bookmark from the terminal
#
# Maintainer:   Kris Yotam <krisyotam@pm.me>
# License:      MIT
# Created:      2026-04-05
###############################################################################

DB="${XDG_DATA_HOME:-$HOME/.local/share}/karbs/bookmarks.db"
CAT_ICON="󰉋  "
DM="dmenu -i -l 25 -c -bw 2"

sqlite3 "$DB" "
  CREATE TABLE IF NOT EXISTS bookmarks (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    name        TEXT NOT NULL,
    url         TEXT NOT NULL UNIQUE,
    category    TEXT NOT NULL DEFAULT 'Uncategorized',
    tags        TEXT NOT NULL DEFAULT '',
    description TEXT NOT NULL DEFAULT ''
  );
" 2>/dev/null

# Escape single quotes for inline SQL
sq() { printf '%s' "${1//\'/\'\'}"; }

build_list() {
    sqlite3 "$DB" "SELECT DISTINCT '${CAT_ICON}' || category FROM bookmarks ORDER BY category;"
    printf '%.0s─' {1..40}; echo
    sqlite3 "$DB" "
        SELECT '[' || category || '] ' || name ||
            CASE WHEN tags != '' THEN '  # ' || tags ELSE '' END
        FROM bookmarks ORDER BY category, name;"
}

chosen=$(build_list | $DM -p "  Bookmarks")
[ -z "$chosen" ] && exit 0
[[ "$chosen" == ─* ]] && exit 0

if [[ "$chosen" == "${CAT_ICON}"* ]]; then
    cat="${chosen#${CAT_ICON}}"
    safe_cat=$(sq "$cat")
    chosen2=$(sqlite3 "$DB" "
        SELECT name || CASE WHEN tags != '' THEN '  # ' || tags ELSE '' END
        FROM bookmarks WHERE category = '${safe_cat}' ORDER BY name;" \
        | $DM -p "  ${cat}")
    [ -z "$chosen2" ] && exit 0
    name=$(printf '%s' "$chosen2" | sed 's/  # .*//')
    safe_name=$(sq "$name")
    url=$(sqlite3 "$DB" "SELECT url FROM bookmarks WHERE category = '${safe_cat}' AND name = '${safe_name}' LIMIT 1;")
else
    name_part=$(printf '%s' "$chosen" | sed 's/  # .*//')
    cat=$(printf '%s' "$name_part" | sed 's/^\[\([^]]*\)\].*/\1/')
    name=$(printf '%s' "$name_part" | sed 's/^\[[^]]*\] //')
    safe_cat=$(sq "$cat")
    safe_name=$(sq "$name")
    url=$(sqlite3 "$DB" "SELECT url FROM bookmarks WHERE category = '${safe_cat}' AND name = '${safe_name}' LIMIT 1;")
fi

[ -z "$url" ] && exit 0
xdg-open "$url" &>/dev/null & disown
