#!/bin/bash

set -e -u -o pipefail
shopt -s inherit_errexit nullglob

# shellcheck disable=SC1090
for f in {,/usr/local}/etc/split-browser/*.bash; do source "$f"; done


notify() {
    local summary=$1 body=$2$'\n\n'$3

    # XML-escape for the notification server
    body=${body//'&'/'&amp;'}
    body=${body//'<'/'&lt;'}
    body=${body//'>'/'&gt;'}
    body=${body//'"'/'&quot;'}
    body=${body//"'"/'&apos;'}

    # Escape backslash for GLib's g_strcompress() in libnotify's notify-send
    # shellcheck disable=SC1003
    body=${body//'\'/'\\'}

    notify-send --expire-time=4000 -- "$summary" "$body" || true
}


if [[ ! -e $SB_BOOKMARK_FILE ]]; then
    d=$(dirname -- "$SB_BOOKMARK_FILE")
    mkdir -p -- "$d"
    : >>"$SB_BOOKMARK_FILE"
    sync --file-system -- "$SB_BOOKMARK_FILE"
fi

case "$1" in
    get)
        [[ $# == 1 ]]

        [[ $SB_BOOKMARK_PRETTY_DATE_LEN -le 25 ]] ||
        SB_BOOKMARK_PRETTY_DATE_LEN=25

        export SB_ELLIPSIS \
               SB_BOOKMARK_PRETTY_DATE_LEN \
               SB_BOOKMARK_PRETTY_TITLE_LEN \
               SB_BOOKMARK_PRETTY_OFS='  '

        {
            echo  # select an empty line in dmenu initially
            split-browser-bookmark-pretty <"$SB_BOOKMARK_FILE"
        } |
        SB_SCREEN=bookmarks sb_dmenu -i -l 20 |
        split-browser-bookmark-pretty2url |
        while IFS= read -r url; do ${url:+split-browser-cmd newtab "$url"}; done
    ;;
    add)
        [[ $# == 3 ]]
        url=$2
        title=$3

        date=$(date --rfc-3339=seconds)

        while :; do
            exec {lock_fd}>>"$SB_BOOKMARK_FILE"
            flock -- "$lock_fd"
            [[ ! /dev/fd/$lock_fd -ef $SB_BOOKMARK_FILE ]] || break
            exec {lock_fd}>&-
        done

        if entry=$(grep -m 1 -F -- $'\t'"$url"$'\t' "$SB_BOOKMARK_FILE"); then
            notify 'Already bookmarked' "$url" "${entry##*$'\t'}"
        else
            entry=$date$'\t'$url$'\t'$title

            cp --reflink=auto     -- "$SB_BOOKMARK_FILE"{,.tmp}
            printf '%s\n' "$entry" >>"$SB_BOOKMARK_FILE".tmp
            sync                  -- "$SB_BOOKMARK_FILE".tmp
            mv -T                 -- "$SB_BOOKMARK_FILE"{.tmp,}
            d=$(dirname           -- "$SB_BOOKMARK_FILE")
            sync -- "$d"

            notify "$SB_STAR  Page bookmarked" "$url" "$title"
        fi
    ;;
esac
