#!/bin/bash
# Detect the GPU with a connected display and write an Xorg config fragment.
# Run automatically by the postinst, or manually if you change GPU/display setup.
#
# Output: /etc/X11/xorg.conf.d/10-headless-kiosk.conf
# To override: create /etc/X11/xorg.conf.d/20-local.conf

set -e

XORG_CONF=/etc/X11/xorg.conf.d/10-headless-kiosk.conf

if [[ $EUID -ne 0 ]]; then
    echo "Run as root." >&2
    exit 1
fi

# Find the first DRM card with a connected output
connected_card=""
for status_file in /sys/class/drm/card*-*/status; do
    [[ "$(cat "$status_file")" == "connected" ]] || continue
    # Extract card name (e.g. card1 from card1-HDMI-A-1)
    connected_card=$(basename "$(dirname "$status_file")" | grep -oP '^card\d+')
    break
done

if [[ -z "$connected_card" ]]; then
    echo "No connected display found — skipping Xorg config." >&2
    exit 0
fi

# Get PCI slot (e.g. 0000:00:02.0)
pci_slot=$(grep PCI_SLOT_NAME /sys/class/drm/${connected_card}/device/uevent | cut -d= -f2)

# Convert to Xorg BusID format: 0000:00:02.0 -> PCI:0:2:0
busid=$(echo "$pci_slot" | sed 's/[0-9a-f]*://' | awk -F'[.:]' \
    '{printf "PCI:%d:%d:%d", strtonum("0x"$1), strtonum("0x"$2), strtonum("0x"$3)}')

# All modern drivers (i915, amdgpu, radeon, nouveau) work with modesetting in Xorg
# Exception: proprietary nvidia needs its own driver
kernel_driver=$(grep '^DRIVER=' /sys/class/drm/${connected_card}/device/uevent | cut -d= -f2)
case "$kernel_driver" in
    nvidia) xorg_driver="nvidia" ;;
    *)      xorg_driver="modesetting" ;;
esac

echo "==> Connected display on $connected_card (PCI slot: $pci_slot, driver: $kernel_driver)"
echo "    Writing $XORG_CONF (BusID: $busid, Xorg driver: $xorg_driver)"

mkdir -p /etc/X11/xorg.conf.d
cat > "$XORG_CONF" << EOF
# Generated by headless-kiosk-xorg-setup — do not edit.
# To override, create /etc/X11/xorg.conf.d/20-local.conf
# Detected: $connected_card / $pci_slot ($kernel_driver)

Section "Device"
    Identifier "Kiosk GPU"
    Driver     "$xorg_driver"
    BusID      "$busid"
EndSection

Section "Screen"
    Identifier "Kiosk Screen"
    Device     "Kiosk GPU"
EndSection
EOF
