#!/usr/bin/env bash

set -euo pipefail

fail() {
    printf 'Panama action IPC contract: %s\n' "$1" >&2
    exit 1
}

active_target=""
original_state=""
night_light_snapshot=""

restore_target() {
    local target="$1" expected="$2" current
    current="$(qs ipc call "$target" status 2>/dev/null || true)"
    if [[ $current != "$expected" && ( $expected == true || $expected == false ) ]]; then
        qs ipc call "$target" toggle >/dev/null 2>&1 || true
    fi
}

cleanup() {
    if [[ -n $active_target ]]; then
        restore_target "$active_target" "$original_state"
    fi
    if [[ -n $night_light_snapshot ]]; then
        local enabled automatic
        enabled="$(jq -r '.enabled' <<<"$night_light_snapshot")"
        automatic="$(jq -r '.automatic' <<<"$night_light_snapshot")"
        qs ipc call night-light restore "$enabled" "$automatic" >/dev/null 2>&1 || true
    fi
}
trap cleanup EXIT

exercise_toggle() {
    local target="$1" before after restored
    before="$(qs ipc call "$target" status)"
    active_target="$target"
    original_state="$before"

    [[ $before == true || $before == false ]] \
        || fail "$target returned a non-boolean status: $before"

    after="$(qs ipc call "$target" toggle)"
    [[ $after != "$before" ]] \
        || fail "$target did not change state: before=$before after=$after"

    restored="$(qs ipc call "$target" toggle)"
    [[ $restored == "$before" ]] \
        || fail "$target did not restore its original state: before=$before restored=$restored"

    active_target=""
    original_state=""
}

ipc="$(qs ipc show)"
rg -q '^target caffeine$' <<<"$ipc" || fail 'caffeine IPC target is missing'
rg -q '^target night-light$' <<<"$ipc" || fail 'night-light IPC target is missing'

exercise_toggle caffeine

night_light_snapshot="$(qs ipc call night-light settings)"
jq -e '.enabled | type == "boolean"' <<<"$night_light_snapshot" >/dev/null \
    || fail 'night-light settings omitted enabled state'
jq -e '.automatic | type == "boolean"' <<<"$night_light_snapshot" >/dev/null \
    || fail 'night-light settings omitted automatic state'
exercise_toggle night-light

original_enabled="$(jq -r '.enabled' <<<"$night_light_snapshot")"
original_automatic="$(jq -r '.automatic' <<<"$night_light_snapshot")"
qs ipc call night-light restore "$original_enabled" "$original_automatic" >/dev/null
restored_snapshot="$(qs ipc call night-light settings)"
[[ "$(jq -r '.enabled' <<<"$restored_snapshot")" == "$original_enabled" ]] \
    || fail 'night-light enabled state was not restored'
[[ "$(jq -r '.automatic' <<<"$restored_snapshot")" == "$original_automatic" ]] \
    || fail 'night-light automatic schedule was not restored'
night_light_snapshot=""

printf 'Panama action IPC contract: PASS\n'
