#!/bin/bash

ENV_FILE="/run/user/$(id -u)/.external_display_env"

cleanup() {
    echo "Restoring Wayland environment variables..."
    dbus-update-activation-environment --systemd DISPLAY="" XDG_SESSION_TYPE=wayland EGL_PLATFORM=wayland GDK_BACKEND=wayland QT_QPA_PLATFORM=wayland
    echo "Cleanup complete."
    exit
}

trap cleanup SIGINT SIGTERM

kill_pair_and_cleanup() {
    local pid1="$1"
    local pid2="$2"

    if [ -n "$pid1" ] && kill -0 "$pid1" 2>/dev/null; then
        kill "$pid1" 2>/dev/null || true
    fi
    if [ -n "$pid2" ] && kill -0 "$pid2" 2>/dev/null; then
        kill "$pid2" 2>/dev/null || true
    fi

    sleep 1

    if [ -n "$pid1" ] && kill -0 "$pid1" 2>/dev/null; then
        kill -9 "$pid1" 2>/dev/null || true
    fi
    if [ -n "$pid2" ] && kill -0 "$pid2" 2>/dev/null; then
        kill -9 "$pid2" 2>/dev/null || true
    fi

    cleanup
}

load_external_display_env() {
    if [ ! -f "$ENV_FILE" ]; then
        return 0
    fi

    echo "Loading external display environment from $ENV_FILE"

    while IFS= read -r line || [ -n "$line" ]; do
        case "$line" in
            ''|\#*)
                continue
                ;;
            *=*)
                key="${line%%=*}"
                value="${line#*=}"

                case "$key" in
                    MUTTER_WAYLAND_NESTED_DISPLAY_RESOLUTION)
                        export "$key=$value"
                        echo "Exported $key=$value"
                        ;;
                    *)
                        echo "Ignoring unsupported key: $key"
                        ;;
                esac
                ;;
            *)
                echo "Ignoring malformed line: $line"
                ;;
        esac
    done < "$ENV_FILE"
}

load_external_display_env

if [ -x /usr/libexec/mutter-furios-screencast-streamer ]; then
    echo "mutter-furios-screencast-streamer found, using mutter wayland backend"

    XDG_SESSION_TYPE=wayland
    GNOME_SHELL_SKIP_DBUS=1
    GNOME_SHELL_WAYLAND_SOCKET=wayland-1
    GNOME_SHELL_DISABLE_OSK=1
    export XDG_SESSION_TYPE
    export GNOME_SHELL_SKIP_DBUS
    export GNOME_SHELL_WAYLAND_SOCKET
    export GNOME_SHELL_DISABLE_OSK
    export MUTTER_WAYLAND_NESTED_DISPLAY_RESOLUTION

    echo "Starting mutter DRM streamer"
    /usr/libexec/mutter-furios-screencast-streamer &
    STREAMER_PID=$!

    echo "Starting GNOME Shell with Wayland..."
    gnome-shell --wayland --nested &
    SHELL_PID=$!

    wait -n "$STREAMER_PID" "$SHELL_PID"
    echo "One process exited. stopping both..."

    kill_pair_and_cleanup "$STREAMER_PID" "$SHELL_PID"
else
    echo "Setting X11 environment variables..."
    dbus-update-activation-environment --systemd DISPLAY=:1 XDG_SESSION_TYPE=x11 EGL_PLATFORM=x11 GDK_BACKEND=x11 QT_QPA_PLATFORM=xcb

    DISPLAY=:1
    XDG_SESSION_TYPE=x11
    EGL_PLATFORM=x11
    GDK_BACKEND=x11
    export DISPLAY
    export XDG_SESSION_TYPE
    export EGL_PLATFORM
    export GDK_BACKEND

    echo "Starting GNOME Shell with X11..."
    gnome-shell --force-animations --x11

    cleanup
fi
