#!/bin/bash

set -euo pipefail

repo_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)"
qs_dir="$repo_dir/config/dot/quickshell"
osd="$qs_dir/modules/osd/Osd.qml"
state="$qs_dir/services/OsdState.qml"
shell_file="$qs_dir/shell.qml"
keybinds="$repo_dir/config/dot/hypr/keybinds.lua"

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

[[ -f "$osd" ]] || fail 'Prism OSD surface is missing'
[[ -f "$state" ]] || fail 'OSD presentation state is missing'
[[ -f "$qs_dir/modules/osd/qmldir" ]] || fail 'OSD module manifest is missing'
rg -q '^import Quickshell$' "$state" \
    || fail 'OSD singleton does not import the Quickshell Singleton type'

rg -Fq 'import qs.modules.osd' "$shell_file" || fail 'shell does not import the OSD module'
[[ "$(rg -c '^[[:space:]]*Osd \{\}' "$shell_file")" -eq 1 ]] \
    || fail 'shell does not create exactly one OSD per screen'
rg -Fq 'target: "osd"' "$shell_file" || fail 'OSD IPC target is missing'
rg -Fq 'OsdState.progress(kind, value, maximum, label)' "$shell_file" \
    || fail 'progress IPC is not wired to OSD state'
rg -Fq 'OsdState.message(kind, label)' "$shell_file" \
    || fail 'message IPC is not wired to OSD state'

rg -Fq 'WlrLayershell.namespace: "qs-popover-osd"' "$osd" \
    || fail 'OSD does not use the existing Prism blur namespace'
rg -Fq 'WlrLayershell.keyboardFocus: WlrKeyboardFocus.None' "$osd" \
    || fail 'OSD may steal keyboard focus'
# The OSD used to take no pointer input at all. It now takes some, because a
# secondary click on a visible OSD opens its settings and dismisses it -- and a
# Wayland input region cannot be told to admit one button and not another, so
# the feature is not available without a region.
#
# What still has to hold is that the region is BOUNDED to the OSD's own surface
# rather than the screen. The OSD floats over whatever is underneath for a
# couple of seconds; a region larger than the card would swallow clicks meant
# for a window nobody could see was being covered.
rg -Fq 'mask: Region {' "$osd" || fail 'OSD declares no input region at all'
rg -Fq 'item: inputMask' "$osd" \
    || fail 'the OSD input region is not bound to an item, so it may cover more than the OSD itself'
rg -Fq 'anchors.fill: parent' "$osd" \
    || fail 'the OSD input mask does not track the surface it belongs to'
rg -Fq 'PrismEdge {' "$osd" || fail 'OSD is missing the Prism signature edge'
rg -Fq 'font.features: Theme.tabularFigures' "$osd" \
    || fail 'changing percentages do not use tabular figures'

rg -Fq '$HOME/.config/quickshell/scripts/panama-osd' "$keybinds" \
    || fail 'keybinds do not use the deployed Panama OSD helper'
for action in \
    'volume up 6' \
    'volume down 6' \
    'volume toggle' \
    'microphone toggle' \
    'volume up 1' \
    'volume down 1' \
    'media play-pause' \
    'media next' \
    'media previous' \
    'media stop' \
    'brightness up 5' \
    'brightness down 5'; do
    rg -Fq "osd(\"$action\")" "$keybinds" \
        || fail "keybind is not routed through panama-osd $action"
done

printf 'osd ui contract: PASS\n'
