#! /bin/sh

SCRIPT_NAME="$(basename -- "$0")"

print_error () {
  for MESSAGE in "$@" ; do
    printf "%s: %s\n" "$SCRIPT_NAME" "$MESSAGE" >&2
  done
}

print_info () {
  for MESSAGE in "$@" ; do
    printf "%s: %s\n" "$SCRIPT_NAME" "$MESSAGE"
  done
}

if [ $# -ge 1 ] ; then
  print_error "ignoring arguments $*"
fi

# Check if XDG_RUNTIME_DIR is defined
if [ -z "$XDG_RUNTIME_DIR" ] ; then
  print_info "CRITICAL: '\$XDG_RUNTIME_DIR' IS EMPTY, THIS VERY VERY IS WRONG !"
  print_info "trying to continue anyway, but some things will most probably not work."
  export XDG_RUNTIME_DIR="/run/user/$(id -u)"
  print_info "set XDG_RUNTIME_DIR=%s" "$XDG_RUNTIME_DIR"
fi

# Create OLDE runtime directory
mkdir -p "$XDG_RUNTIME_DIR/olde"

# Clean up after GDM
xprop -root -remove _NET_NUMBER_OF_DESKTOPS \
      -remove _NET_DESKTOP_NAMES \
      -remove _NET_CURRENT_DESKTOP 2> /dev/null

# Set up the environment
A="/etc/xdg/olde/environment"
test -r $A && . $A
A="${XDG_CONFIG_HOME:-"$HOME/.config"}/olde/environment"
test -r $A && . $A

# Try to use gnome-keyring-daemon in place of ssh-agent, and if it's not
# available, tell ssh-add to use ssh-askpass
GKD_STARTED=0
if command -v gnome-keyring-daemon > /dev/null ; then
  print_info "checking for gnome-keyring-daemon..."
  if ! pgrep -fla -u $(id -u) gnome-keyring-daemon > /dev/null ; then
    print_info "starting gnome-keyring-daemon..."
    export $(gnome-keyring-daemon --start)
    GKD_STARTED=1
  else
    print_info "starting gnome-keyring-daemon SSH component..."
    export $(gnome-keyring-daemon --start --components=ssh)
  fi
elif command -v ssh-askpass > /dev/null ; then
  print_info "setting SSH_ASKPASS_REQUIRE=prefer..."
  export SSH_ASKPASS_REQUIRE=prefer
else
  print_error "neither gnome-keyring-daemon nor ssh-askpass are available"
fi

# Force XDG environment variables (may be omitted by DM or wrongly set)
print_info "setting XDG_CURRENT_DESKTOP=OLDE (was ${XDG_CURRENT_DESKTOP:-empty})"
export XDG_CURRENT_DESKTOP=OLDE
print_info "setting XDG_SESSION_DESKTOP=OLDE (was ${XDG_SESSION_DESKTOP:-empty})"
export XDG_SESSION_DESKTOP=OLDE

# Import environment to dbus (and systemd). Do it in a subshell, so we can
# exclude login-session-specific environment variables. Also, save variables
# for units which need them.
(
  for VAR in XDG_SEAT XDG_SESSION_ID XDG_VTNR ; do
    printf "%s=%s\n" "$VAR" "$(eval printf "%s" "\$$VAR")" > "$XDG_RUNTIME_DIR/olde/$VAR"
    unset $VAR
  done
  dbus-update-activation-environment --verbose --systemd --all
)

# Debug files
mkdir -p "$XDG_RUNTIME_DIR/olde/debug"
env | sort > "$XDG_RUNTIME_DIR/olde/debug/environment"
systemctl --user show-environment | sort > "$XDG_RUNTIME_DIR/olde/debug/environment_systemd"

# Run olde-session service and wait until it exits
systemctl --user --wait start olde-session.target

# Stop all OLDE services
systemctl --user stop $(basename -a /usr/lib/systemd/user/olde*.service)

# Kill gnome-keyring-daemon if we started it
if [ $GKD_STARTED -eq 1 ] ; then
  print_info "killing gnome-keyring-daemon..."
  pkill -u $(id -u) -f gnome-keyring-daemon
fi

# Clean up XDG variables
systemctl --user unset-environment XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP

# Clean up after xrdp
XRDP_VARS="$(env | grep -E '^(XRDP|PULSE_SCRIPT)' | cut -d = -f 1)"
if [ -n "$XRDP_VARS" ] ; then
  print_info "cleaning up xrdp environment variables..."
  systemctl --user unset-environment $XRDP_VARS
fi
