#!/bin/sh
# Mette lo sfondo di SkillFishOS al primo accesso.
#
# Ci abbiamo provato in tre modi, tutti ragionevoli e tutti inutili:
#   1. look-and-feel con Image=<percorso del PNG>  -> Plasma vuole un pacchetto
#   2. pacchetto wallpaper vero + Image=<percorso> -> giusto, ma mai letto
#   3. la stessa riga in /etc/skel/...appletsrc    -> Plasma RISCRIVE quel file
#
# Il punto e' il terzo: al primo accesso Plasma rigenera
# `plasma-org.kde.plasma.desktop-appletsrc` e butta via la nostra sezione. Sul
# sistema installato quella riga semplicemente non c'era piu'. E il `defaults`
# del look-and-feel viene consultato solo quando il tema viene APPLICATO, non a
# ogni nuovo utente.
#
# Verificato dal vivo sull'installato: `plasma-apply-wallpaperimage` con il
# PERCORSO del pacchetto funziona ("Impostato correttamente lo sfondo per tutti
# i desktop ... basato su KPackage"), mentre col solo nome no. Quindi il
# pacchetto e' valido: mancava solo qualcuno che glielo dicesse al momento
# giusto.
#
# ⚠️ PERCHE' E' STATO RISCRITTO (25/08/2026). La versione precedente provava
# dieci volte a distanza di tre secondi e poi RINUNCIAVA IN SILENZIO. Su due
# avvii identici della 26.06.6 da chiavetta, uno e' arrivato al desktop con lo
# sfondo predefinito di Plasma e ci e' rimasto: trenta secondi non bastano
# sempre, e nessuno se ne accorgeva perche' lo script usciva 0 comunque.
# E' la prima cosa che si vede di SkillFishOS.
#
# Due cose cambiano:
#   - PRIMA SI ASPETTA PLASMA, invece di sparare comandi nel vuoto. Si aspetta
#     che risponda su D-Bus, fino a tre minuti. `X-KDE-autostart-phase=2` dice
#     "dopo plasmashell", ma "avviato" non vuol dire "pronto a rispondere".
#   - POI SI CONTROLLA CHE SIA ANDATA, invece di fidarsi dell'uscita del
#     comando: si rilegge la configurazione e si guarda se lo sfondo e' il
#     nostro. Il segnaposto si scrive SOLO a conferma avvenuta, quindi al
#     prossimo accesso si riprova invece di dare per fatto qualcosa che non e'
#     successo. Chi si sceglie un altro sfondo non viene disturbato: il
#     segnaposto a quel punto c'e' gia'.
#
# Quello che va storto finisce in ~/.cache/skillfish-wallpaper.log: senza, un
# guasto come quello di prima resta invisibile.
set -u

CONF="${XDG_CONFIG_HOME:-$HOME/.config}"
STAMP="$CONF/skillfish-wallpaper-applied"
CFG="$CONF/plasma-org.kde.plasma.desktop-appletsrc"
PKG=/usr/share/wallpapers/SkillFishOS
LOG="${XDG_CACHE_HOME:-$HOME/.cache}/skillfish-wallpaper.log"

mkdir -p "$(dirname "$LOG")" 2>/dev/null || true
nota() { echo "$(date -Is) $*" >> "$LOG" 2>/dev/null || true; }

QD=""
for c in qdbus6 qdbus-qt6 qdbus; do
    command -v "$c" >/dev/null 2>&1 && { QD="$c"; break; }
done


messo() {
    [ -f "$CFG" ] || return 1
    awk '
        /^\[Containments\]\[[0-9]+\]\[Wallpaper\]\[org\.kde\.image\]\[General\]$/ { dentro = 1; next }
        /^\[/                                                          { dentro = 0 }
        dentro && /^Image=/ && /SkillFishOS/                            { img = 1 }
        dentro && /^DynamicMode=/ && !/^DynamicMode=0$/                 { modo = 1 }
        dentro && /^SlidePaths=./                                       { slide = 1 }
        END { exit (img && !modo && !slide) ? 0 : 1 }
    ' "$CFG"
}

# --- 0. la schermata di blocco e l'avatar -----------------------------------
# ⚠️ Queste due non aspettano Plasma e non c'entrano con lo sfondo della
# scrivania: si fanno subito, una volta, e non toccano niente che l'utente
# abbia gia' scelto. Servono a chi ha installato PRIMA che i file entrassero
# nel pacchetto: per chi installa adesso ci pensa /etc/skel.
AVATAR=/usr/share/skillfish/avatar-fish.png
SFONDO=/usr/share/wallpapers/SkillFishOS/contents/images/3840x2160.png
BLOCCO="$CONF/kscreenlockerrc"

# ⚠️ NON "se non c'e'": il file arriva SEMPRE, e' /etc/skel/.face di
# desktop-base, quindi quella condizione non sarebbe mai vera e il nostro pesce
# non comparirebbe mai. Si scrive una volta sola e si segna: chi dopo si mette
# la sua foto non viene piu' toccato.
# .face.icon lo legge KDE (KUser::faceIconPath), .face accountsservice.
SEGNO_AVATAR="$CONF/skillfish-avatar-applied"
if [ -f "$AVATAR" ] && [ ! -f "$SEGNO_AVATAR" ]; then
    mkdir -p "$CONF" 2>/dev/null || true
    cp "$AVATAR" "$HOME/.face.icon" 2>/dev/null || true
    cp "$AVATAR" "$HOME/.face" 2>/dev/null || true
    date -Is > "$SEGNO_AVATAR" 2>/dev/null || true
    nota "avatar messo"
fi

if [ -f "$SFONDO" ] && ! grep -q "SkillFishOS" "$BLOCCO" 2>/dev/null; then
    if command -v kwriteconfig6 >/dev/null 2>&1; then
        kwriteconfig6 --file kscreenlockerrc --group Greeter \
                      --key WallpaperPlugin org.kde.image 2>/dev/null || true
        kwriteconfig6 --file kscreenlockerrc --group Greeter --group Wallpaper \
                      --group org.kde.image --group General \
                      --key Image "$SFONDO" 2>/dev/null || true
        nota "sfondo della schermata di blocco impostato"
    else
        nota "kwriteconfig6 non c'e': schermata di blocco lasciata com'era"
    fi
fi

# ⚠️ IL SEGNAPOSTO NON BASTA PIU'.
# Prima bastava, e infatti sulla VM di build ha tenuto in piedi una settimana di
# sfondo sbagliato: c'era il segnaposto, quindi lo script usciva subito, quindi
# nessuno rimetteva a posto niente. Adesso il segnaposto vale solo se anche la
# configurazione e' davvero a posto; se non lo e' si riprova, e chi si e'
# scelto un altro sfondo di suo non viene disturbato perche' quella e'
# un'immagine che non contiene SkillFishOS e il controllo la lascia stare.
if [ -f "$STAMP" ]; then
    messo && exit 0
    if grep -q "Image=.*SkillFishOS" "$CFG" 2>/dev/null; then
        nota "segnaposto presente ma la configurazione e' in presentazione: riparo"
    else
        exit 0
    fi
fi
[ -d "$PKG" ] || { nota "il pacchetto $PKG non c'e'"; exit 0; }
command -v plasma-apply-wallpaperimage >/dev/null 2>&1 || {
    nota "plasma-apply-wallpaperimage non c'e'"; exit 0; }

# --- 1. aspettare che Plasma risponda davvero -------------------------------
# ⚠️ Il binario si chiama qdbus6 su trixie/sid: cercarne solo "qdbus" vuol dire
# non trovarlo e ripiegare sul controllo del processo, che dice "esiste" molto
# prima che sia pronto.
i=0
pronto=0
while [ "$i" -lt 90 ]; do
    if [ -n "$QD" ]; then
        "$QD" org.kde.plasmashell >/dev/null 2>&1 && { pronto=1; break; }
    else
        pgrep -u "$(id -u)" -x plasmashell >/dev/null 2>&1 && { pronto=1; break; }
    fi
    i=$((i + 1))
    sleep 2
done
[ "$pronto" = 1 ] || nota "Plasma non ha risposto in 3 minuti: provo lo stesso"

# --- 2. applicare, e verificare ---------------------------------------------
# Si guarda dentro la sezione giusta: un "SkillFishOS" trovato altrove nel file
# (il tema, le icone, il nome di un pannello) non c'entra niente con lo sfondo.
# ⚠️ NON BASTA CHE Image= SIA LA NOSTRA.
# Con DynamicMode=2 (presentazione) il plugin ignora quell'immagine e pesca a
# rotazione da SlidePaths, dove c'e' anche lo sfondo di Debian. Sulla VM di
# build e' rimasto cosi' per una settimana: il file diceva SkillFishOS, lo
# schermo mostrava Debian, e lo script aveva scritto il segnaposto.

# La modalita' immagine fissa, scritta con lo scripting di Plasma: e' l'unico
# modo di toccare la configurazione mentre la sessione gira senza che Plasma la
# riscriva sopra un attimo dopo.
# ⚠️ Il binario si chiama qdbus6 su trixie/sid.
ferma_la_presentazione() {
    [ -n "$QD" ] || return 1
    "$QD" org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript '
var ds = desktops();
for (var i = 0; i < ds.length; i++) {
    ds[i].wallpaperPlugin = "org.kde.image";
    ds[i].currentConfigGroup = ["Wallpaper", "org.kde.image", "General"];
    ds[i].writeConfig("Image", "file:///usr/share/wallpapers/SkillFishOS/");
    ds[i].writeConfig("DynamicMode", 0);
    ds[i].writeConfig("SlidePaths", "");
}
' >/dev/null 2>&1
}

i=0
while [ "$i" -lt 30 ]; do
    plasma-apply-wallpaperimage "$PKG" >/dev/null 2>&1
    # ⚠️ plasma-apply-wallpaperimage scrive Image= e NIENTE ALTRO: se la
    # configurazione e' in presentazione, quell'immagine non si vede.
    ferma_la_presentazione
    sleep 2
    if messo; then
        mkdir -p "$(dirname "$STAMP")" 2>/dev/null || true
        date -Is > "$STAMP"
        [ "$i" = 0 ] || nota "sfondo messo dopo $((i + 1)) tentativi"
        exit 0
    fi
    i=$((i + 1))
    sleep 2
done

# Nessun segnaposto: al prossimo accesso si riprova. Meglio riprovare che
# dichiarare fatto.
nota "NON sono riuscito a mettere lo sfondo dopo 30 tentativi"
exit 0
