#!/bin/bash
# WINDOW_AGENT_SCRIPT_DOCSTRING_BEGIN
# Определяет активную локальную графическую сессию пользователя через loginctl и печатает shell assignments для wrapper-скрипта.
#
# return: печатает переменные окружения или запускает основной бинарник;
# errors: диагностические сообщения отправляются в stderr.
# WINDOW_AGENT_SCRIPT_DOCSTRING_END
# Detect active local graphical login session and print shell assignments.

set -euo pipefail

shell_quote() {
    printf '%q' "$1"
}

print_var() {
    local key="$1"
    local value="${2:-}"
    printf '%s=' "$key"
    shell_quote "$value"
    printf '\n'
}

get_prop() {
    local session="$1"
    local prop="$2"
    loginctl show-session "$session" -p "$prop" --value 2>/dev/null || true
}

read_proc_env() {
    local pid="$1"
    local key="$2"
    [ -r "/proc/$pid/environ" ] || return 0
    tr '\0' '\n' < "/proc/$pid/environ" 2>/dev/null | awk -F= -v k="$key" '$1 == k {sub("^[^=]*=", ""); print; exit}' || true
}

find_user_proc_env() {
    local uid="$1"
    local key="$2"
    local names=(kwin_x11 kwin_wayland plasmashell ksmserver startplasma-x11 startplasma-wayland Xorg Xwayland)
    local name pid value
    for name in "${names[@]}"; do
        pid=$(pgrep -u "$uid" -n "$name" 2>/dev/null || true)
        if [ -n "$pid" ]; then
            value=$(read_proc_env "$pid" "$key")
            if [ -n "$value" ]; then
                printf '%s\n' "$value"
                return 0
            fi
        fi
    done
    return 0
}

choose_session() {
    local force_user="${WINDOW_AGENT_FORCE_USER:-}"
    local session active remote type user state display seat

    loginctl list-sessions --no-legend 2>/dev/null | awk '{print $1}' | while read -r session; do
        [ -n "$session" ] || continue
        active=$(get_prop "$session" Active)
        remote=$(get_prop "$session" Remote)
        type=$(get_prop "$session" Type)
        user=$(get_prop "$session" Name)
        state=$(get_prop "$session" State)
        display=$(get_prop "$session" Display)
        seat=$(get_prop "$session" Seat)

        if [ -n "$force_user" ] && [ "$user" != "$force_user" ]; then
            continue
        fi

        if [ "$active" = "yes" ] && [ "$remote" = "no" ]; then
            if [ "$type" = "x11" ] || [ "$type" = "wayland" ] || [ -n "$display" ]; then
                printf '%s\n' "$session"
                return 0
            fi
        fi
    done
}

session=$(choose_session | head -n 1)

if [ -z "${session:-}" ]; then
    echo "No active local graphical session found" >&2
    exit 1
fi

active=$(get_prop "$session" Active)
remote=$(get_prop "$session" Remote)
type=$(get_prop "$session" Type)
user=$(get_prop "$session" Name)
uid=$(get_prop "$session" User)
display=$(get_prop "$session" Display)
seat=$(get_prop "$session" Seat)
state=$(get_prop "$session" State)
leader=$(get_prop "$session" Leader)

home=$(getent passwd "$uid" | cut -d: -f6)

# Some display managers do not expose all environment values via loginctl.
# Try the session leader first, then typical KDE/X11/Wayland processes.
proc_display=""
proc_xauthority=""
proc_wayland_display=""
proc_runtime_dir=""
proc_dbus_session_bus_address=""
proc_xdg_current_desktop=""
proc_xdg_session_desktop=""
proc_kde_session_version=""

if [ -n "$leader" ]; then
    proc_display=$(read_proc_env "$leader" DISPLAY)
    proc_xauthority=$(read_proc_env "$leader" XAUTHORITY)
    proc_wayland_display=$(read_proc_env "$leader" WAYLAND_DISPLAY)
    proc_runtime_dir=$(read_proc_env "$leader" XDG_RUNTIME_DIR)
    proc_dbus_session_bus_address=$(read_proc_env "$leader" DBUS_SESSION_BUS_ADDRESS)
    proc_xdg_current_desktop=$(read_proc_env "$leader" XDG_CURRENT_DESKTOP)
    proc_xdg_session_desktop=$(read_proc_env "$leader" XDG_SESSION_DESKTOP)
    proc_kde_session_version=$(read_proc_env "$leader" KDE_SESSION_VERSION)
fi

[ -n "$proc_display" ] || proc_display=$(find_user_proc_env "$uid" DISPLAY)
[ -n "$proc_xauthority" ] || proc_xauthority=$(find_user_proc_env "$uid" XAUTHORITY)
[ -n "$proc_wayland_display" ] || proc_wayland_display=$(find_user_proc_env "$uid" WAYLAND_DISPLAY)
[ -n "$proc_runtime_dir" ] || proc_runtime_dir=$(find_user_proc_env "$uid" XDG_RUNTIME_DIR)
[ -n "$proc_dbus_session_bus_address" ] || proc_dbus_session_bus_address=$(find_user_proc_env "$uid" DBUS_SESSION_BUS_ADDRESS)
[ -n "$proc_xdg_current_desktop" ] || proc_xdg_current_desktop=$(find_user_proc_env "$uid" XDG_CURRENT_DESKTOP)
[ -n "$proc_xdg_session_desktop" ] || proc_xdg_session_desktop=$(find_user_proc_env "$uid" XDG_SESSION_DESKTOP)
[ -n "$proc_kde_session_version" ] || proc_kde_session_version=$(find_user_proc_env "$uid" KDE_SESSION_VERSION)

if [ -z "$type" ] && [ -n "$display" ]; then
    type="x11"
fi

if [ -z "$display" ] && [ -n "$proc_display" ]; then
    display="$proc_display"
fi

if [ "$type" = "x11" ] && [ -z "$display" ]; then
    display=":0"
fi

xauthority="$proc_xauthority"
if [ "$type" = "x11" ] && [ -z "$xauthority" ]; then
    if [ -f "$home/.Xauthority" ]; then
        xauthority="$home/.Xauthority"
    elif [ -f "/run/user/$uid/gdm/Xauthority" ]; then
        xauthority="/run/user/$uid/gdm/Xauthority"
    fi
fi

runtime_dir="$proc_runtime_dir"
if [ -z "$runtime_dir" ]; then
    runtime_dir="/run/user/$uid"
fi

wayland_display="$proc_wayland_display"
if [ "$type" = "wayland" ] && [ -z "$wayland_display" ]; then
    wayland_display="wayland-0"
fi

if [ -z "$proc_dbus_session_bus_address" ] && [ -n "$uid" ]; then
    proc_dbus_session_bus_address="unix:path=/run/user/$uid/bus"
fi

# LockedHint is provided by systemd-logind on systems that support session locks.
# If it is unavailable, keep an empty value: the collector will treat it as false.
locked=$(get_prop "$session" LockedHint)

print_var ACTIVE_SESSION_ID "$session"
print_var ACTIVE_SESSION_STATE "$state"
print_var ACTIVE_SESSION_SEAT "$seat"
print_var ACTIVE_USER "$user"
print_var ACTIVE_UID "$uid"
print_var ACTIVE_HOME "$home"
print_var XDG_SESSION_TYPE "$type"
print_var XDG_RUNTIME_DIR "$runtime_dir"
print_var DBUS_SESSION_BUS_ADDRESS "$proc_dbus_session_bus_address"
print_var XDG_CURRENT_DESKTOP "$proc_xdg_current_desktop"
print_var XDG_SESSION_DESKTOP "$proc_xdg_session_desktop"
print_var KDE_SESSION_VERSION "$proc_kde_session_version"
print_var SESSION_LOCKED "$locked"
print_var DISPLAY "$display"
print_var XAUTHORITY "$xauthority"
print_var WAYLAND_DISPLAY "$wayland_display"
print_var USER "$user"
print_var LOGNAME "$user"
print_var HOME "$home"
