# ===== Skrypt automatycznej instalacji poprawek (USB, Audio, DroidCam) =====

# Opis: Skrypt łączy wszystkie poprawki w jeden proces. Automatycznie wykrywa wersję WirePlumber (0.4 vs 0.5+) dla dystrybucji Ubuntu/Kubuntu i konfiguruje system pod kątem bezawaryjnego streamingu z OBS Flatpak.

# 1. Pobranie i uruchomienie skryptu instalacyjnego

cat << 'EOF' > setup-obs-fix.sh
#!/bin/bash
set -e

echo "=== [1/4] Wyłączanie autosuspendu USB (Globalnie + udev) ==="
sudo tee /etc/modprobe.d/usbcore.conf > /dev/null << 'EOT'
options usbcore autosuspend=-1
EOT

sudo tee /etc/systemd/system/usb-global-keepalive.service > /dev/null << 'EOT'
[Unit]
Description=Disable USB Autosuspend Globally for All Ports
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for d in /sys/bus/usb/devices/*/power/control; do [ -f "$d" ] && echo on > "$d"; done; for s in /sys/bus/usb/devices/*/power/autosuspend; do [ -f "$s" ] && echo 0 > "$s"; done'
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
EOT

echo 'ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="19f7", ATTR{idProduct}=="002e", TEST=="power/control", ATTR{power/control}="on"' | sudo tee /etc/udev/rules.d/50-rode-power.rules > /dev/null

sudo udevadm control --reload
sudo update-initramfs -u
sudo systemctl daemon-reload
sudo systemctl enable --now usb-global-keepalive.service

echo "=== [2/4] Optymalizacja PipeWire & WirePlumber (Rode / Audio) ==="
WP_VER=$(wireplumber --version 2>/dev/null | awk '{print $NF}' | cut -d. -f1,2)

if [ -n "$WP_VER" ]; then
    WP_MAJOR=$(echo $WP_VER | cut -d. -f1)
    WP_MINOR=$(echo $WP_VER | cut -d. -f2)

    if [ "$WP_MAJOR" -gt 0 ] || [ "$WP_MINOR" -ge 5 ]; then
        echo "Wykryto WirePlumber 0.5+ (Tworzenie konfiguracji SPA-JSON)..."
        mkdir -p ~/.config/wireplumber/wireplumber.conf.d
        cat > ~/.config/wireplumber/wireplumber.conf.d/51-rode-nosuspend.conf << 'EOT'
monitor.alsa.rules = [
  {
    matches = [
      { node.name = "~alsa_input.usb-R__DE_Wireless_GO_II_RX.*" }
    ]
    actions = {
      update-props = {
        session.suspend-timeout-seconds = 0
        node.pause-on-idle = false
        api.alsa.headroom = 1024
      }
    }
  }
]
EOT
    else
        echo "Wykryto WirePlumber 0.4.x (Tworzenie konfiguracji Lua)..."
        mkdir -p ~/.config/wireplumber/main.lua.d
        cat > ~/.config/wireplumber/main.lua.d/51-rode-nosuspend.lua << 'EOT'
rule = {
  matches = {
    {
      { "node.name", "matches", "alsa_input.usb-R__DE_Wireless_GO_II_RX.*" },
    },
  },
  apply_properties = {
    ["session.suspend-timeout-seconds"] = 0,
    ["node.pause-on-idle"] = false,
    ["api.alsa.headroom"] = 1024,
  },
}
table.insert(alsa_monitor.rules, rule)
EOT
    fi
fi

mkdir -p ~/.config/pipewire/pipewire.conf.d ~/.config/pipewire/pipewire-pulse.conf.d

cat > ~/.config/pipewire/pipewire.conf.d/99-stable.conf << 'EOT'
context.properties = {
  default.clock.rate = 48000
  default.clock.quantum = 1024
  default.clock.min-quantum = 512
  default.clock.max-quantum = 2048
}
EOT

cat > ~/.config/pipewire/pipewire-pulse.conf.d/99-stable.conf << 'EOT'
pulse.properties = {
  pulse.min.req = 512/48000
  pulse.min.quantum = 512/48000
  pulse.default.req = 1024/48000
}
EOT

systemctl --user restart wireplumber pipewire pipewire-pulse

echo "=== [3/4] Trwała naprawa gniazda usbmuxd (iPhone / DroidCam OBS) ==="
if [ -f /lib/udev/rules.d/39-usbmuxd.rules ]; then
    sudo cp /lib/udev/rules.d/39-usbmuxd.rules /etc/udev/rules.d/39-usbmuxd.rules
    sudo sed -i '/usbmuxd -x/d' /etc/udev/rules.d/39-usbmuxd.rules
    sudo udevadm control --reload
fi

sudo mkdir -p /etc/systemd/system/multi-user.target.wants
sudo ln -sf /lib/systemd/system/usbmuxd.service /etc/systemd/system/multi-user.target.wants/usbmuxd.service

sudo mkdir -p /etc/systemd/system/usbmuxd.service.d
printf '[Service]\nRestart=always\nRestartSec=1\n' | sudo tee /etc/systemd/system/usbmuxd.service.d/restart.conf > /dev/null

sudo systemctl daemon-reload
sudo systemctl start usbmuxd

echo "=== [4/4] Uprawnienia Flatpak OBS Studio ==="
if flatpak list | grep -q "com.obsproject.Studio"; then
    flatpak override --user --device=all com.obsproject.Studio
    flatpak override --user --socket=pulseaudio com.obsproject.Studio
    echo "Uprawnienia Flatpak zostały zaktualizowane."
fi

echo "======================================================"
echo " GOTOWE! Zalecany restart komputera (sudo reboot)."
echo "======================================================"
EOF

chmod +x setup-obs-fix.sh
./setup-obs-fix.sh

# ===== Co robi ten skrypt? =====

1. Wyłącza usypianie portów USB w jądrze oraz wymusza tryb on w systemd.
2. Sprawdza wersję WirePlumbera – jeśli system to starszy Ubuntu (np. 24.04 LTS), tworzy skrypt Lua, a jeśli nowszy (0.5+), tworzy plik w nowym formacie SPA JSON.
3. Ustawia pasmo PipeWire na 48 kHz i chroni bufor audio przed chrupaniem/przerwami.
4. Naprawia usbmuxd, uniemożliwiając zabijanie gniazda po wypięciu kabla iPhone'a.
5. Nadaje uprawnienia dla OBS Studio we Flatpaku do urządzeń i dźwięku.

# ===== Weryfikacja po restarcie =====

systemctl is-active usb-global-keepalive.service usbmuxd
pw-metadata -n settings 0 | grep -E "quantum|clock.rate"