#!/bin/sh
# Called from zia-forsuryaos postinst (as root). Restarts zia-bridge for every
# active graphical session and runs workspace migration as each desktop user.
# No manual systemctl restart after apt install/upgrade/reinstall.

set -e

HANDOFF_LOG_TAG="zia-bridge-handoff"

log() {
  echo "${HANDOFF_LOG_TAG}: $*" >&2
}

migrate_user() {
  uid="$1"
  user="$(getent passwd "$uid" 2>/dev/null | cut -d: -f1)" || return 0
  [ -n "$user" ] || return 0
  [ "$user" = "root" ] && return 0
  _MIGRATE=/usr/libexec/zia-forsuryaos/zia-workspace-migrate
  if [ -x "$_MIGRATE" ]; then
    su - "$user" -c "$_MIGRATE" 2>/dev/null || true
  fi
}

restart_bridge_for_uid() {
  uid="$1"
  [ -n "$uid" ] || return 0
  runtime="/run/user/$uid"
  [ -d "$runtime" ] || return 0
  if command -v systemctl >/dev/null 2>&1; then
    if systemctl --user --machine="${uid}@.host" daemon-reload >/dev/null 2>&1; then
      systemctl --user --machine="${uid}@.host" try-restart zia-bridge.service >/dev/null 2>&1 \
        || systemctl --user --machine="${uid}@.host" restart zia-bridge.service >/dev/null 2>&1 \
        || true
      return 0
    fi
    user="$(getent passwd "$uid" 2>/dev/null | cut -d: -f1)" || true
    if [ -n "$user" ] && [ "$user" != "root" ]; then
      su - "$user" -c "XDG_RUNTIME_DIR=$runtime systemctl --user daemon-reload 2>/dev/null; XDG_RUNTIME_DIR=$runtime systemctl --user try-restart zia-bridge.service 2>/dev/null || XDG_RUNTIME_DIR=$runtime systemctl --user restart zia-bridge.service 2>/dev/null" \
        || true
    fi
  fi
}

handoff_all_graphical_sessions() {
  if ! command -v loginctl >/dev/null 2>&1; then
    log "loginctl missing; falling back to install-time user only"
    return 1
  fi
  found=0
  for sess in $(loginctl list-sessions --no-legend 2>/dev/null | awk '{print $1}'); do
    uid=$(loginctl show-session "$sess" -p User --value 2>/dev/null || true)
    type=$(loginctl show-session "$sess" -p Type --value 2>/dev/null || true)
    state=$(loginctl show-session "$sess" -p State --value 2>/dev/null || true)
    [ -z "$uid" ] && continue
    case "$type" in wayland|x11|mir) ;; *) continue ;; esac
    case "$state" in active|online) ;; *) continue ;; esac
    found=1
    migrate_user "$uid"
    restart_bridge_for_uid "$uid"
  done
  [ "$found" -eq 1 ]
}

handoff_install_user() {
  _REAL_USER=""
  if [ -n "${SUDO_USER:-}" ]; then
    _REAL_USER="$SUDO_USER"
  elif [ -n "${PKEXEC_UID:-}" ]; then
    _REAL_USER="$(getent passwd "$PKEXEC_UID" 2>/dev/null | cut -d: -f1)" || true
  fi
  [ -z "$_REAL_USER" ] && _REAL_USER="$(logname 2>/dev/null)" || true
  [ -z "$_REAL_USER" ] || [ "$_REAL_USER" = "root" ] && return 1
  _REAL_UID="$(id -u "$_REAL_USER" 2>/dev/null)" || return 1
  migrate_user "$_REAL_UID"
  restart_bridge_for_uid "$_REAL_UID"
  return 0
}

case "${1:-}" in
  configure)
    if [ -d /run/systemd/system ]; then
      handoff_all_graphical_sessions || handoff_install_user || true
    fi
    ;;
esac

exit 0
