#!/bin/bash
# Select and record the EDID-preferred workstation mode without affecting kiosk.
set -euo pipefail

OUTPUT=${MCOM03_WORKSTATION_OUTPUT:-HDMIA}
MODE=${MCOM03_WORKSTATION_MODE:-auto}
RATE=${MCOM03_WORKSTATION_RATE:-60}
ATTEMPTS=${MCOM03_WORKSTATION_DISPLAY_ATTEMPTS:-30}
WATCH_SECONDS=${MCOM03_WORKSTATION_DISPLAY_WATCH_SECONDS:-2}
MODE_ACTION=once
STATE_DIR=${XDG_STATE_HOME:-$HOME/.local/state}/mcom03-display
EVENT_LOG=$STATE_DIR/events.tsv

usage() {
    cat <<'EOF'
Usage: mcom03-workstation-display [--once|--watch]

`auto` waits for HDMI and invokes xrandr --auto, selecting the EDID-preferred
mode. Explicit modes remain available only for administrative diagnostics.
EOF
}

case ${1:-} in
    '') ;;
    --once) MODE_ACTION=once ;;
    --watch) MODE_ACTION=watch ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown option: $1" >&2; usage >&2; exit 64 ;;
esac

case $ATTEMPTS in
    ''|*[!0-9]*)
        echo "MCOM03_WORKSTATION_DISPLAY_ATTEMPTS must be a non-negative integer." >&2
        exit 64
        ;;
esac

case $WATCH_SECONDS in ''|*[!0-9]*) echo "Invalid watch interval." >&2; exit 64 ;; esac
install -d -m 0700 "$STATE_DIR"

record_state() {
    local state active edid connector
    state=$(xrandr --query 2>/dev/null || true)
    active=$(awk -v output="$OUTPUT" '
        $1 == output && $2 == "connected" { inside = 1; next }
        inside && /^[^[:space:]]/ { exit }
        inside && /\*/ { print $1; exit }
    ' <<<"$state")
    connector=$(find /sys/class/drm -maxdepth 1 -name 'card*-HDMI-A-*' \
        -exec sh -c '[ -r "$1/status" ] && [ "$(cat "$1/status")" = connected ] && echo "$1"' sh {} \; \
        | head -1)
    edid=absent
    [ -n "$connector" ] && [ -r "$connector/edid" ] && \
        edid=$(sha256sum "$connector/edid" | awk '{print $1}')
    printf '%s\t%s\t%s\t%s\t%s\n' "$(date -Is)" "$OUTPUT" \
        "${active:-disconnected}" "$edid" "$MODE" >>"$EVENT_LOG"
}

apply_mode() {
    local state
    for ((attempt = 0; attempt < ATTEMPTS; attempt++)); do
        state=$(xrandr --query 2>/dev/null) || { sleep 1; continue; }
        if ! grep -Eq "^${OUTPUT}[[:space:]]+connected" <<<"$state"; then
            sleep 1
            continue
        fi
        if [ "$MODE" = auto ]; then
            xrandr --output "$OUTPUT" --auto
            record_state
            return 0
        fi
        if ! awk -v output="$OUTPUT" -v mode="$MODE" '
                $2 == "connected" { active = ($1 == output); next }
                active && $1 == mode { found = 1 }
                END { exit !found }
            ' <<<"$state"; then
            echo "$OUTPUT does not advertise $MODE; leaving its current mode unchanged." >&2
            record_state
            return 0
        fi
        xrandr --output "$OUTPUT" --mode "$MODE" --rate "$RATE"
        record_state
        return 0
    done
    record_state
    echo "X11 output $OUTPUT was not ready after $ATTEMPTS seconds." >&2
    return 1
}

if [ "$MODE_ACTION" = once ]; then
    apply_mode
    exit $?
fi

last_state=
while :; do
    current=$(xrandr --query 2>/dev/null || true)
    if [ "$current" != "$last_state" ]; then
        apply_mode || true
        last_state=$current
    fi
    sleep "$WATCH_SECONDS"
done
