#!/bin/sh
set -eu

# setup-icewm.sh — Alpine: Xorg + startx + IceWM (no display manager)
# - Config globale: /usr/share/icewm/roby + link in /etc/icewm
# - Tema: scaricato da URL e installato in /usr/share/icewm/themes
# - Terminale con tab: lxterminal
# - Spegni/Riavvia dal menu Logout (password root dentro terminale)
# - 1 solo workspace + niente pulsanti extra + niente monitor CPU/RAM/NET
# - Toolbar: File (pcmanfm + icona pcmanfm), Terminal, Browser (senza librewolf)

THEME_NAME="Icewm-Nord-style"
THEME_URL="https://vroby.freeddns.org/distribuzioni-linux/alpine-linux/Icewm-Nord-style.7z"

CFGROOT="/usr/share/icewm/roby"
THEMESROOT="/usr/share/icewm/themes"

log(){ printf '%s\n' "== $* =="; }
die(){ printf '%s\n' "ERRORE: $*" >&2; exit 1; }

[ "$(id -u)" -eq 0 ] || die "Esegui da root: sudo sh $0"

log "Repo community + update"
sed -i 's/^[[:space:]]*#\([[:space:]]*.*\/community\)/\1/' /etc/apk/repositories 2>/dev/null || true
apk update

log "Rimuovo LightDM se presente"
rc-service lightdm stop 2>/dev/null || true
rc-update del lightdm default 2>/dev/null || true
apk del lightdm lightdm-gtk-greeter 2>/dev/null || true

log "Installo: base + Xorg + IceWM + terminale + file manager + audio + utility"
REQ_PKGS="
  eudev udev-init-scripts dbus elogind shadow
  xorg-server xinit xf86-input-libinput mesa-dri-gallium xauth xrandr
  fontconfig ttf-dejavu ttf-liberation terminus-font
  icewm lxterminal pcmanfm
  pipewire pipewire-pulse wireplumber alsa-utils
  curl tar xdg-utils
  hicolor-icon-theme adwaita-icon-theme
  7zip
"
OPT_PKGS="xf86-video-qxl xf86-video-vesa firefox chromium htop"

apk add --no-cache $REQ_PKGS
apk add --no-cache $OPT_PKGS 2>/dev/null || true

# 7zip su Alpine può fornire 7zz; p7zip fornisce 7z. Usiamo quello che c'è.
SEVENZIP=""
command -v 7z  >/dev/null 2>&1 && SEVENZIP="7z"
command -v 7zz >/dev/null 2>&1 && [ -z "$SEVENZIP" ] && SEVENZIP="7zz"
[ -n "$SEVENZIP" ] || die "Non trovo 7z/7zz (pacchetto 7zip installato ma comando mancante)"

log "Servizi (OpenRC)"
rc-update add udev sysinit 2>/dev/null || true
rc-update add udev-trigger sysinit 2>/dev/null || true
rc-update add udev-settle sysinit 2>/dev/null || true
rc-update add udev-postmount default 2>/dev/null || true
rc-update add dbus default 2>/dev/null || true
rc-update add elogind default 2>/dev/null || true

log "Font cache"
fc-cache -f 2>/dev/null || true

log "Tastiera IT"
mkdir -p /etc/X11/xorg.conf.d
cat > /etc/X11/xorg.conf.d/00-keyboard.conf <<'EOF'
Section "InputClass"
    Identifier "system-keyboard"
    MatchIsKeyboard "on"
    Option "XkbLayout" "it"
EndSection
EOF

log "xinitrc di sistema (startx -> icewm-session)"
mkdir -p /etc/X11/xinit
cat > /etc/X11/xinit/xinitrc <<'EOF'
#!/bin/sh
if command -v dbus-run-session >/dev/null 2>&1; then
  exec dbus-run-session icewm-session
else
  exec icewm-session
fi
EOF
chmod +x /etc/X11/xinit/xinitrc

log "Config globale IceWM in $CFGROOT"
rm -rf "$CFGROOT"
mkdir -p "$CFGROOT" "$CFGROOT/icons" "$THEMESROOT"

log "Wrapper comandi (file manager / browser / terminal / power)"
cat > /usr/local/bin/ice-files <<'EOF'
#!/bin/sh
if command -v pcmanfm >/dev/null 2>&1; then exec pcmanfm; fi
if command -v caja   >/dev/null 2>&1; then exec caja; fi
if command -v thunar >/dev/null 2>&1; then exec thunar; fi
exec xdg-open "$HOME" 2>/dev/null || exec lxterminal
EOF

cat > /usr/local/bin/ice-browser <<'EOF'
#!/bin/sh
# NO librewolf
if command -v firefox   >/dev/null 2>&1; then exec firefox; fi
if command -v chromium  >/dev/null 2>&1; then exec chromium; fi
exec xdg-open "https://example.com" 2>/dev/null || exec lxterminal
EOF

cat > /usr/local/bin/ice-term <<'EOF'
#!/bin/sh
# IceWM può invocare: TerminalCommand -e <cmd...>
# lxterminal supporta --command=...
if [ "${1:-}" = "-e" ] || [ "${1:-}" = "--execute" ]; then
  shift
  [ "$#" -gt 0 ] || exec lxterminal
  exec lxterminal --command="/bin/sh -lc \"$*\""
fi
exec lxterminal
EOF

cat > /usr/local/bin/icewm-poweroff <<'EOF'
#!/bin/sh
exec lxterminal -T "Spegni" --command="/bin/sh -lc 'su -c /sbin/poweroff'"
EOF

cat > /usr/local/bin/icewm-reboot <<'EOF'
#!/bin/sh
exec lxterminal -T "Riavvia" --command="/bin/sh -lc 'su -c /sbin/reboot'"
EOF

chmod +x /usr/local/bin/ice-files /usr/local/bin/ice-browser /usr/local/bin/ice-term \
         /usr/local/bin/icewm-poweroff /usr/local/bin/icewm-reboot

log "Startup globale (PipeWire/WirePlumber)"
cat > "$CFGROOT/startup" <<'EOF'
#!/bin/sh
pgrep -x pipewire >/dev/null 2>&1 || (pipewire >/dev/null 2>&1 &)
pgrep -x wireplumber >/dev/null 2>&1 || (wireplumber >/dev/null 2>&1 &)
pgrep -x pipewire-pulse >/dev/null 2>&1 || (pipewire-pulse >/dev/null 2>&1 &)
exit 0
EOF
chmod +x "$CFGROOT/startup"

log "Tema: download + install (NON richiede default.theme)"
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT

curl -fsSL "$THEME_URL" -o "$TMPDIR/theme.7z"
"$SEVENZIP" x "$TMPDIR/theme.7z" -o"$TMPDIR/extract" >/dev/null

# Copia directory “candidate” (contengono preferences o theme o default.theme)
THEME_DIRS_FILE="$TMPDIR/theme-dirs.txt"
: > "$THEME_DIRS_FILE"
find "$TMPDIR/extract" -type f \( -name 'preferences' -o -name 'theme' -o -name 'default.theme' \) -print0 \
  | while IFS= read -r -d '' f; do dirname "$f" >> "$THEME_DIRS_FILE"; done
sort -u "$THEME_DIRS_FILE" -o "$THEME_DIRS_FILE" 2>/dev/null || true

# Se non trova marker, copia comunque tutte le dir top-level
if [ ! -s "$THEME_DIRS_FILE" ]; then
  find "$TMPDIR/extract" -mindepth 1 -maxdepth 1 -type d -print > "$THEME_DIRS_FILE" || true
fi

INSTALLED_NAMES_FILE="$TMPDIR/installed-names.txt"
: > "$INSTALLED_NAMES_FILE"

while IFS= read -r d; do
  [ -d "$d" ] || continue
  name="$(basename "$d")"
  [ -n "$name" ] || continue
  rm -rf "$THEMESROOT/$name" 2>/dev/null || true
  cp -a "$d" "$THEMESROOT/$name"
  printf '%s\n' "$name" >> "$INSTALLED_NAMES_FILE"
done < "$THEME_DIRS_FILE"

# Scegli tema: preferisci THEME_NAME se esiste, altrimenti il primo installato
if [ ! -d "$THEMESROOT/$THEME_NAME" ]; then
  first="$(head -n 1 "$INSTALLED_NAMES_FILE" 2>/dev/null || true)"
  [ -n "$first" ] || die "Tema non installato: nell'archivio non ho trovato directory utilizzabili"
  THEME_NAME="$first"
fi

# Theme spec: se c'è default.theme o theme usa quello, altrimenti la directory
THEME_SPEC="$THEME_NAME"
[ -f "$THEMESROOT/$THEME_NAME/default.theme" ] && THEME_SPEC="$THEME_NAME/default.theme"
[ -f "$THEMESROOT/$THEME_NAME/theme" ]         && THEME_SPEC="$THEME_NAME/theme"

cat > "$CFGROOT/theme" <<EOF
Theme="$THEME_SPEC"
EOF

log "Icone toolbar (pcmanfm, terminale, browser) in $CFGROOT/icons"
pick_png() {
  dest="$1"; shift
  src=""
  for pat in "$@"; do
    src="$(find /usr/share/pixmaps /usr/share/icons /usr/lib 2>/dev/null \
      -type f | grep -iE "$pat" | grep -iE '\.png$' | head -n 1 || true)"
    [ -n "$src" ] && break
  done
  [ -n "$src" ] || return 1
  cp -f "$src" "$dest"
}

# pcmanfm icon (priorità alta)
pick_png "$CFGROOT/icons/pcmanfm.png" \
  'pcmanfm.*\.png' 'org\.lxde\.pcmanfm.*\.png' 'system-file-manager.*\.png' 'file-manager.*\.png' \
  || true

pick_png "$CFGROOT/icons/term.png" \
  'lxterminal.*\.png' 'utilities-terminal.*\.png' 'terminal.*\.png' \
  || true

pick_png "$CFGROOT/icons/browser.png" \
  'firefox.*\.png' 'chromium.*\.png' 'browser.*\.png' \
  || true

icon_or_dash() { [ -f "$CFGROOT/icons/$1.png" ] && printf '%s' "$1" || printf '%s' "-"; }
PCMANFM_ICON="$(icon_or_dash pcmanfm)"
TERM_ICON="$(icon_or_dash term)"
BROWSER_ICON="$(icon_or_dash browser)"

# comandi toolbar (preferisci app reali se presenti)
FILES_CMD="/usr/local/bin/ice-files";  command -v pcmanfm  >/dev/null 2>&1 && FILES_CMD="pcmanfm"
BROWSER_CMD="/usr/local/bin/ice-browser"
command -v firefox  >/dev/null 2>&1 && BROWSER_CMD="firefox"
command -v chromium >/dev/null 2>&1 && [ "$BROWSER_CMD" = "/usr/local/bin/ice-browser" ] && BROWSER_CMD="chromium"

log "Preferences (1 desktop, niente pulsanti extra, niente monitor, terminale, power)"
cat > "$CFGROOT/preferences" <<EOF
Workspaces=1
WorkspaceNames="1"
TaskBarShowWorkspaces=0

ShowTaskBar=1
TaskBarShowStartMenu=1
TaskBarShowWindows=1
TaskBarShowTray=1
TaskBarEnableSystemTray=1
TaskBarShowClock=1

TaskBarShowWindowListMenu=0
TaskBarShowShowDesktopButton=0

TaskBarShowCPUStatus=0
TaskBarShowMEMStatus=0
TaskBarShowNetStatus=0
TaskBarShowMailboxStatus=0

IconPath="$CFGROOT/icons:/usr/share/pixmaps:/usr/share/icons"
IconThemes="*:-HighContrast"

TerminalCommand="/usr/local/bin/ice-term"
ShutdownCommand="/usr/local/bin/icewm-poweroff"
RebootCommand="/usr/local/bin/icewm-reboot"
EOF

log "Toolbar (File=pcmanfm, Terminal, Browser) — NO librewolf"
cat > "$CFGROOT/toolbar" <<EOF
prog "File"     $PCMANFM_ICON  $FILES_CMD
prog "Terminal" $TERM_ICON     /usr/local/bin/ice-term
prog "Browser"  $BROWSER_ICON  $BROWSER_CMD
EOF

log "Link globali: /usr/share/icewm + /etc/icewm -> $CFGROOT"
mkdir -p /etc/icewm /usr/share/icewm

ln -sf "$CFGROOT/preferences" /usr/share/icewm/preferences
ln -sf "$CFGROOT/toolbar"     /usr/share/icewm/toolbar
ln -sf "$CFGROOT/theme"       /usr/share/icewm/theme
ln -sf "$CFGROOT/startup"     /usr/share/icewm/startup

ln -sf "$CFGROOT/preferences" /etc/icewm/preferences
ln -sf "$CFGROOT/toolbar"     /etc/icewm/toolbar
ln -sf "$CFGROOT/theme"       /etc/icewm/theme
ln -sf "$CFGROOT/startup"     /etc/icewm/startup


log "Scorciatoie da tastiera"
cat >> "$CFGROOT/keys" <<'EOF'
key "Super+Return" lxterminal
key "Super+F1" librewolf
EOF

ln -sf "$CFGROOT/keys" /usr/share/icewm/keys
ln -sf "$CFGROOT/keys" /etc/icewm/keys



log "Autostart startx al login su tty1 (utenti non-root)"
mkdir -p /etc/profile.d
cat > /etc/profile.d/00-autostartx.sh <<'EOF'
case "$-" in *i*) ;; *) return ;; esac
[ -z "${DISPLAY:-}" ] || return
[ -z "${SSH_CONNECTION:-}" ] || return
[ "$(id -u)" -ne 0 ] || return
if [ -n "${XDG_VTNR:-}" ] && [ "$XDG_VTNR" = "1" ]; then exec startx; fi
if [ "$(tty 2>/dev/null)" = "/dev/tty1" ]; then exec startx; fi
EOF

log "COMPLETATO — reboot consigliato"
