#!/usr/bin/env bash

set -euo pipefail

fail() {
    printf 'focus-session expiry: %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

# focus start records the caffeine state it found so end() can hand it back, and
# the assertion below requires caffeine to finish off. Both are only true if
# caffeine starts off.
#
# This test kills and restarts the live shell, so an interrupted run leaves
# caffeine on with nothing to turn it back off. The next run then records
# "previously on", faithfully restores it, and fails -- and every run after
# that fails identically, with the desktop quietly unable to idle or lock the
# whole time. Refuse to start from that state rather than latching it in.
if [[ "$(qs ipc call caffeine status 2>/dev/null)" != "false" ]]; then
    fail 'caffeine is on before the session starts -- this test cannot distinguish "restored correctly" from "never released". Turn it off first: qs ipc call caffeine toggle'
fi

qs ipc call focus start >/dev/null

state_file=$(find "${XDG_STATE_HOME:-$HOME/.local/state}/quickshell/by-shell" -name focus-session.json -print -quit)
[[ -n "$state_file" ]] || fail 'persistent state file was not created'

expired=$(mktemp "${state_file}.expired.XXXXXX")
jq '.paused = false | .deadlineMs = 1' "$state_file" >"$expired"
chmod --reference="$state_file" "$expired"
mv "$expired" "$state_file"

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

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

jq -e '.active == false and .caffeine == false and .doNotDisturb == false' <<<"$status" >/dev/null || fail 'expired session was not completed and released'

trap - EXIT
printf 'focus-session expiry: PASS\n'
