#!/bin/sh
# stidda-setup [base|desktop]: completa un'installazione di Arch (archinstall, Btrfs con @ e @snapshots) con i
# pacchetti e i default di Stidda. Va eseguito da root, anche nel chroot dell'installer (custom_commands),
# dopo aver aggiunto il repository di Stidda. Rieseguirlo è innocuo.
set -eu
# Opzioni: --blocco-spegnimento=si|no  pulsanti di spegnimento e riavvio nella schermata di blocco (R16, default si).
BLOCCO_SPEGNIMENTO=si
PRIMO_AVVIO=no
for a in "$@"; do
    case $a in
        --primo-avvio) PRIMO_AVVIO=si ;;
        --blocco-spegnimento=si|--blocco-spegnimento=no) BLOCCO_SPEGNIMENTO=${a#*=} ;;
        --*) echo "opzione sconosciuta: $a" >&2; exit 2 ;;
    esac
done
PROFILO=desktop
for a in "$@"; do case $a in --*) ;; *) PROFILO=$a ;; esac; done
case $PROFILO in
    base) PACCHETTI="stidda-base" ;;
    desktop) PACCHETTI="stidda-base sddm stidda-desktop-dms stidda-desktop-noctalia stidda-desktop-minimo stidda-desktop-app" ;;
    *) echo "uso: stidda-setup [base|desktop]" >&2; exit 2 ;;
esac
if [ "$PROFILO" = base ] && [ "$PRIMO_AVVIO" = si ]; then
    echo 'Il primo avvio grafico richiede il profilo desktop' >&2
    exit 2
fi
[ "$(id -u)" = 0 ] || { echo "stidda-setup va eseguito da root" >&2; exit 1; }

# 0. Prima si aggiorna da sé e riparte con la versione nuova: altrimenti il resto userebbe l'elenco dei
#    pacchetti della versione vecchia (report 09).
if [ -z "${STIDDA_SETUP_AGGIORNATO:-}" ]; then
    pacman -Syu --noconfirm --needed stidda-setup
    STIDDA_SETUP_AGGIORNATO=1 exec /usr/bin/stidda-setup "$@"
fi

# 1. Riga di comando del kernel per limine-entry-tool: nel chroot dell'installer /proc/cmdline è quella della
#    ISO e lo strumento non la usa (report 08, R38). Va scritta prima dei pacchetti, che generano le voci.
#    Con la radice su LUKS: rd.luks.name= per sd-encrypt (archinstall scrive cryptdevice=, che vale solo per
#    l'hook udev "encrypt").
if [ ! -s /etc/kernel/cmdline ]; then
    install -d /etc/kernel
    sorgente=$(findmnt -no SOURCE / | sed 's/\[.*//')
    if [ "$(lsblk -no TYPE "$sorgente")" = crypt ]; then
        nome=$(basename "$sorgente")
        luks=$(cryptsetup status "$nome" | awk '$1 == "device:" {print $2}')
        radice="rd.luks.name=$(blkid -s UUID -o value "$luks")=$nome root=$sorgente"
    else
        radice="root=PARTUUID=$(findmnt -no PARTUUID /)"
    fi
    printf '%s zswap.enabled=0 rootflags=subvol=@ rw rootfstype=btrfs\n' "$radice" > /etc/kernel/cmdline
fi

# 2. Pacchetti del profilo.
# shellcheck disable=SC2086
pacman -Syu --noconfirm --needed $PACCHETTI

# 2b. Assistente grafico: il pacchetto deve esistere prima di abilitare l'autologin.
if [ "$PRIMO_AVVIO" = si ]; then
    pacman -S --needed --noconfirm stidda-installer
    /usr/lib/stidda/prepara-primo-avvio
fi

# 3. Snapper e voci degli snapshot in Limine.
/usr/lib/stidda/configura-snapper

# 4. Servizi: systemd-resolved sempre (F07; resolv.conf diventa il collegamento allo stub al primo avvio,
#    tramite tmpfiles di stidda-base); sddm e bluetooth per il desktop.
systemctl enable systemd-resolved
if [ "$PROFILO" = desktop ]; then
    systemctl enable sddm bluetooth power-profiles-daemon.service
    # Controllo degli aggiornamenti con notifica (arch-update, S30) per tutti gli utenti: all'avvio e ogni 6 ore.
    systemctl --global enable arch-update.timer
fi

# 4b. Scelte dell'amministratore per le shell. DMS: /etc/stidda/dms-preset.json, unito da preset-dms prima di
#     ogni avvio (vince comunque la scelta dell'utente nel pannello). Noctalia: la chiave dei pulsanti è nel widget
#     di blocco di ciascun monitor (lockscreen-login-box@<uscita>) e non si può impostare in anticipo: solo pannello.
if [ "$PROFILO" = desktop ]; then
    install -d /etc/stidda
    if [ "$BLOCCO_SPEGNIMENTO" = no ]; then v=false; else v=true; fi
    printf '{\n  "lockScreenShowPowerActions": %s\n}\n' "$v" > /etc/stidda/dms-preset.json
fi

# 5. Preset di /etc/skel agli utenti già creati (archinstall li crea prima dei nostri pacchetti, R30).
#    Solo i file mancanti, con il proprietario giusto.
awk -F: '$3 >= 1000 && $3 < 60000 {print $1 ":" $6}' /etc/passwd | while IFS=: read -r utente casa; do
    [ -d "$casa" ] && runuser -u "$utente" -- cp -rn /etc/skel/. "$casa/"
done

# 6. Snapshot di partenza, conservato come "importante" (report 07, E35); uno solo, anche se si riesegue.
NUOVO=no
if ! snapper --no-dbus -c root list --columns description | grep -q '^installazione (stidda-setup'; then
    snapper --no-dbus -c root create --cleanup-algorithm number --userdata important=yes \
        --description "installazione (stidda-setup $PROFILO)"
    NUOVO=si
fi
# 7. Voce di Limine dello snapshot di partenza (R76): nel chroot dell'installer la sincronizzazione
#    asincrona del plugin di snapper non arriva in fondo, quindi la si fa qui, in modo sincrono.
#    Sui sistemi già installati i kernel di allora non ci sono più e la voce non si può creare: solo un avviso.
n=$(snapper --no-dbus -c root --csvout list --columns number,description | awk -F, '$2 ~ /^installazione \(stidda-setup/ {print $1; exit}')
limine-snapper-sync >/dev/null 2>&1 || true
if ! grep -qE "^[[:space:]]+///$n " /boot/limine.conf; then
    if [ "$NUOVO" = si ]; then
        echo "stidda-setup: lo snapshot $n di installazione non ha la voce in Limine" >&2; exit 1
    fi
    echo "stidda-setup: avviso, lo snapshot $n di installazione non ha la voce in Limine" >&2
fi
# snapperd, se già attivo, non vede le modifiche fatte con --no-dbus finché non riparte (report 09).
systemctl try-restart snapperd.service >/dev/null 2>&1 || true
echo "stidda-setup $PROFILO completato"
