#!/bin/bash
# Aggressive display keep-alive for Raspberry Pi
# Supports both X11 and Wayland environments

DISPLAY_TIMEOUT=30

# Detect display server type
detect_display_server() {
    if [ -n "$WAYLAND_DISPLAY" ]; then
        echo "wayland"
    elif [ -n "$DISPLAY" ]; then
        echo "x11"
    else
        echo "unknown"
    fi
}

DISPLAY_SERVER=$(detect_display_server)

while true; do
    # Keep HDMI powered on (works for both X11 and Wayland)
    if command -v tvservice &> /dev/null; then
        /usr/bin/tvservice -p 2>/dev/null
    fi
    
    if [ "$DISPLAY_SERVER" = "wayland" ]; then
        # Wayland-specific power management
        
        # Method 1: Use wlr-randr for Wayland compositors (if available)
        if command -v wlr-randr &> /dev/null; then
            wlr-randr --output HDMI-A-1 --on 2>/dev/null || true
        fi
        
        # Method 2: Prevent idle using systemd-inhibit
        if command -v systemd-inhibit &> /dev/null; then
            # This is already running, but refresh the lock
            systemctl --user restart plasma-ksmserver.service 2>/dev/null || true
        fi
        
        # Method 3: Use wlopm (Wayland output power management)
        if command -v wlopm &> /dev/null; then
            wlopm --on \* 2>/dev/null || true
        fi
        
        # Method 4: Simulate activity via input (works on Wayland)
        if command -v ydotool &> /dev/null; then
            ydotool mousemove -x 1 -y 1 2>/dev/null || true
            ydotool mousemove -x -1 -y -1 2>/dev/null || true
        fi
        
        # Method 5: GNOME/KDE Wayland idle inhibit
        if command -v gnome-session-inhibit &> /dev/null; then
            # Already inhibited by running process
            true
        fi
        
    else
        # X11-specific power management (original code)
        if command -v xset &> /dev/null; then
            DISPLAY=:0 xset s off 2>/dev/null
            DISPLAY=:0 xset -dpms 2>/dev/null
            DISPLAY=:0 xset dpms force on 2>/dev/null
            DISPLAY=:0 xset s reset 2>/dev/null
        fi
        
        # Move mouse to trigger activity
        if command -v xdotool &> /dev/null; then
            DISPLAY=:0 xdotool mousemove_relative 1 1 2>/dev/null
            DISPLAY=:0 xdotool mousemove_relative -1 -1 2>/dev/null
        fi
        
        # Disable monitor power saving
        if command -v xrandr &> /dev/null; then
            DISPLAY=:0 xrandr --output HDMI-1 --power-profile performance 2>/dev/null || true
        fi
    fi
    
    sleep $DISPLAY_TIMEOUT
done
