#!/bin/bash

set -e -u -o pipefail
shopt -s inherit_errexit nullglob
export -n IFS=$'\t'
exec {saved_stdout_fd}>&1 >&2

# shellcheck disable=SC1090
for f in {,/usr/local}/etc/split-browser-disp/*.bash; do source "$f"; done
export SB_INTO_FIREFOX=/run/split-browser-disp/into-firefox \
       SB_FROM_FIREFOX=/run/split-browser-disp/from-firefox


while IFS= read -r cmd_line; do
    readarray -d $'\t' -t cmd <<<"$cmd_line"
    cmd[-1]=${cmd[-1]%$'\n'}

    case "${cmd[0]}" in
        setup)
            cd -- "$SB_FIREFOX_DIR"

            [[ -w . && -w defaults/pref/ ]] ||
            sudo install -d -m u+rwx -o "$EUID" . defaults/pref/
            f=( /[u]sr{/local,}/share/split-browser-disp/firefox/sb-load.js )
            ln -s "${f[0]}" defaults/pref/
            f=( /[u]sr{/local,}/share/split-browser-disp/firefox/sb.js )
            printf '%s\n' '' "${cmd[@]:1}" ';' | cat - "${f[0]}" >sb.js

            mkfifo -- "$SB_FROM_FIREFOX"
            cat      <"$SB_FROM_FIREFOX" >&"$saved_stdout_fd" &
            # shellcheck disable=SC2064
            trap "wait $! || exit \$?" EXIT
            trap 'exit 0' USR1
            trap 'exit 1' USR2
        ;;
        master)
            (
                "${SB_FIREFOX[@]}" "${cmd[@]:1}" && sig=USR1 || sig=USR2
                kill -s "$sig" $$
            ) &
        ;;
        helper)
            "${cmd[@]:1}"
        ;;
        autotype)
            if type xdotool >/dev/null; then xdotool type -- "${cmd[*]:1}"; fi
        ;;
        newtab)
            socat -u STDIN UNIX-CONNECT:"$SB_INTO_FIREFOX" <<<"${cmd[*]:1}"
        ;;
        *)
            printf 'Unknown command from persistent side: %s\n' "${cmd[0]}"
        ;;
    esac
done
