#!/usr/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

fail=/run/split-browser-disp/fail
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"
            trap 'if [[ -e "$fail" ]]; then exit 1; else exit 0; fi' USR1
            (
                cat <"$SB_FROM_FIREFOX" >&"$saved_stdout_fd" || : >"$fail"
                kill -s USR1 $$
            ) &
        ;;
        master)
            (
                exec {_dummy_writer_fd}>"$SB_FROM_FIREFOX"
                "${SB_FIREFOX[@]}" "${cmd[@]:1}" || : >"$fail"
            ) &
        ;;
        helper)
            "${cmd[@]:1}"
        ;;
        autotype)
            xdotool type -- "${cmd[*]:1}" || [[ $? == 127 ]]
        ;;
        newtab)
            socat -u STDIN UNIX-CONNECT:"$SB_INTO_FIREFOX" <<<"${cmd[*]:1}"
        ;;
        *)
            printf 'Unknown command from persistent side: %s\n' "${cmd[0]}"
        ;;
    esac
done
