#!/usr/bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com>

# Must be run from within Polkit (pkexec)
uid="$PKEXEC_UID"

prev_tty=$(/usr/bin/loginctl list-sessions | awk '$7 != "-" && $2 == '$uid'' | xargs | cut -f 7 -d " ")
prev_tty_num=$(echo $prev_tty | cut -c 4-)
free_tty=$(find -L /proc/[1-9]*/fd/. ! -name . -prune -type c -exec  stat -Lc '%t %T' {} + |
  awk '$1 == "4" {seen[$2]}
       END {
         for (i=1; i<=63; i++)
           if (!(sprintf("%x", i) in seen))
             print "/dev/tty" i
       }' | tail -n 1)
seat_num=$(/usr/bin/loginctl list-sessions | awk '$4 != "-" && $2 == '$uid'' | xargs | cut -f 4 -d " " | cut -b 5-)

echo "prev_tty:     $prev_tty"
echo "prev_tty_num: $prev_tty_num"
echo "free_tty:     $free_tty"
echo "uid:          $uid"
echo "seat_num:     $seat_num"

if ! getent passwd atychia > /dev/null 2>&1; then
    useradd -r atychia
fi
if ! command -v cage &> /dev/null; then
    sudo -u \#$uid DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus \
      notify-send "Could not launch Desktop Recovery" \
      "The cage compositor is not installed. Please open an issue at https://github.com/filotimo-linux/atychia.\nTo restart plasmashell, press Meta+Ctrl+Shift+B." \
      --urgency=critical --icon=system-help --app-name="Desktop Recovery"
    exit 1
fi

sudo install -g atychia -o atychia -d /home/atychia/

chvt "$(echo "$free_tty" | cut -c 9-)"

sudo /usr/bin/systemd-run \
    --property PAMName=login \
    --property User="atychia" \
    --property StandardInput=tty \
    --property TTYPath="$free_tty" \
    --property TTYReset=yes \
    --property TTYVHangup=yes \
    --property Environment="XCURSOR_THEME=breeze_cursors" \
    --property Environment="WLR_NO_HARDWARE_CURSORS=1" \
    --property Environment="QT_QPA_PLATFORMTHEME=kde" \
    --property Environment="XDG_CURRENT_DESKTOP=kde" \
    bash -c "cage -dsm last -- /usr/bin/atychia $prev_tty_num $uid $seat_num || chvt $prev_tty_num"
