#!/usr/bin/env bash

set -euo pipefail

fail() {
    printf 'focus-session restart: %s\n' "$1" >&2
    exit 1
}

cleanup() {
    qs ipc call focus end >/dev/null 2>&1 || true
}
trap cleanup EXIT

qs ipc call focus end >/dev/null 2>&1 || true
qs ipc call focus start >/dev/null
qs ipc call focus pause >/dev/null
before=$(qs ipc call focus status)

# Restart the shell the way it is actually running. Under supervision
# (panama-quickshell.service), `qs kill` + a bare relaunch would race the
# unit's own Restart=on-failure and leave two shells fighting over the bus;
# unsupervised, the unit path does not exist and the old dance is right.
if systemctl --user is-active -q panama-quickshell.service; then
    systemctl --user restart panama-quickshell.service
else
    qs kill >/dev/null
    for _ in $(seq 1 50); do
        qs list 2>&1 | rg -q '^Instance ' || break
        sleep 0.1
    done
    if qs list 2>&1 | rg -q '^Instance '; then
        fail 'shell did not stop before restart'
    fi
    quickshell --daemonize >/dev/null
fi

status=""
for _ in $(seq 1 60); do
    status=$(qs ipc call focus status 2>/dev/null || true)
    if jq -e '.active == true and .paused == true' <<<"$status" >/dev/null 2>&1; then
        break
    fi
    sleep 0.2
done

jq -e '.active == true' <<<"$status" >/dev/null || fail 'active session was not restored'
jq -e '.paused == true' <<<"$status" >/dev/null || fail 'paused state was not restored'
[[ "$(jq -r .remaining <<<"$status")" == "$(jq -r .remaining <<<"$before")" ]] || fail 'paused remainder changed across restart'
jq -e '.doNotDisturb == true' <<<"$status" >/dev/null || fail 'Do Not Disturb was not reclaimed'
jq -e '.caffeine == true' <<<"$status" >/dev/null || fail 'Caffeine was not reclaimed'

cleanup
trap - EXIT
printf 'focus-session restart: PASS\n'
