#!/bin/bash

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

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


truncate() {
    local str=$1 len=$2

    [[ ${#str} -le $len ]] || str=${str::len - ${#SB_ELLIPSIS}}$SB_ELLIPSIS
    printf %s "$str"
}

mkcd() {
    if [[ ! -e $1 ]]; then
        mkdir -p           -- "$1"
        sync --file-system -- "$1"
    fi

    cd -- "$1"
}


mkcd "$SB_LOGIN_DIR"

[[ $1 == get && $# == [23] ]]
url=$2
#title=$3

urls_textfile=urls.txt
login_executable=login
fields_dir=fields
user_textfile=01-user.txt
pass_textfile=02-pass.txt

matching_sites=()

for f in */**/"$urls_textfile"; do
    while IFS= read -r line; do
        mode=${line::1}
        pattern=${line:1}

        case "$mode" in
            '=')
                [[ $url == "$pattern" ]]
            ;;
            '^')
                sep='[/?#]'
                [[ $pattern != *$sep ]] || sep=
                [[ $url == "$pattern" || $url == "$pattern"$sep* ]]
            ;;
            '~')
                [[ $url =~ ^($pattern)$ ]]
            ;;
            *)
                false
            ;;
        esac || continue

        matching_sites+=( "${f%/*}" )
        break
    done <"$f"
done

if [[ ${#matching_sites[@]} -gt 0 ]]; then
    if [[ ${SB_LOGIN_SECURITY_DELAY_SECONDS:-0} -gt 0 ]]; then
        # Wait a little to prevent the DisposableVM from tricking the user,
        # in case the window manager's focus stealing prevention is too lax

        ms=$(( SB_LOGIN_SECURITY_DELAY_SECONDS * 1000 ))
        notify-send --expire-time="$ms" --urgency=low -- "$SB_ELLIPSIS"
        sleep -- "$SB_LOGIN_SECURITY_DELAY_SECONDS"
    fi

    site=$(printf '%s\n' "${matching_sites[@]}" |
           SB_SCREEN=logins sb_dmenu -p 'Log into')
    cd -- "${site:?}"

    if [[ -e "$login_executable" ]]; then
        ./"$login_executable"
    else
        split-browser-login-fields
    fi
else
    prompt="Name a login database entry for: $(truncate "$url" 50)"
    site=$(SB_SCREEN='logins - add' sb_dmenu -p "$prompt" </dev/null)
    mkcd "$site"

    exec {lock_fd}<.
    flock -- "$lock_fd"

    if [[ ! -e "$fields_dir" && ! -e "$login_executable" ]]; then
        mkdir -p -- "$fields_dir".tmp
        :          >"$fields_dir".tmp/"$user_textfile"
        sb_pwgen   >"$fields_dir".tmp/"$pass_textfile"
        sync     -- "$fields_dir".tmp/{"$user_textfile","$pass_textfile",}
        mv -T    -- "$fields_dir"{.tmp,}
        sync .
    fi

    [[ ! -e "$urls_textfile" ]] || cp --reflink=auto -- "$urls_textfile"{,.tmp}
    printf '=%s\n' "$url" >>"$urls_textfile".tmp
    sync                 -- "$urls_textfile".tmp
    mv -T                -- "$urls_textfile"{.tmp,}
    sync .

    exec qubes-run-terminal {lock_fd}<&-
fi
