#!/usr/bin/env bash
#
#    $file:setup_user_env_pipe.sh created 2026-08-16 09:49 AM Mitteleuropäische Sommerzeit
#    $Id:setup_user_env
#
#    Don Matteo <think@unblog.ch> Aug 16, 2026.
#    Copyright(c) 2010-2026 A-Enterprise GmbH.
#    https://www.a-enterprise.ch
#
#    Released under the GNU General Public License WITHOUT ANY WARRANTY.
#    See LICENSE.TXT for details.
#
#    vim: expandtab sw=4 ts=4 sts=4:
#
# Für den direkten Aufruf per Pipe auf dem Zielhost gedacht, z.B.:
#
#   curl -fsSL https://unblog.ch/arch/rc/setup_user_env_pipe.sh | sudo bash -s -- benutzername
#
# Wichtig: "sh -s --" bzw. "bash -s --" ist nötig, damit das Skript aus der
# Pipe trotzdem ein Kommandozeilenargument (den Benutzernamen) bekommt.
# Ohne "-s --" landet kein $1 im Skript, da stdin bereits vom Pipe-Inhalt
# belegt ist.
#
set -euo pipefail

BASE_URL="https://unblog.ch/arch/rc"

if [[ $EUID -ne 0 ]]; then
    echo "Fehler: bitte mit sudo/root ausführen." >&2
    exit 1
fi

USERNAME="${1:-}"
if [[ -z "$USERNAME" ]]; then
    echo "Verwendung: curl -fsSL <url> | sudo bash -s -- <benutzername>" >&2
    exit 1
fi

if ! id "$USERNAME" &>/dev/null; then
    echo "Fehler: Benutzer '$USERNAME' existiert nicht." >&2
    exit 1
fi

HOME_DIR=$(getent passwd "$USERNAME" | cut -d: -f6)
GROUP=$(id -gn "$USERNAME")

if [[ -z "$HOME_DIR" || ! -d "$HOME_DIR" ]]; then
    echo "Fehler: Home-Verzeichnis für '$USERNAME' nicht gefunden." >&2
    exit 1
fi

echo "Benutzer:         $USERNAME"
echo "Home-Verzeichnis: $HOME_DIR"

TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT

echo "Lade Vorlagendateien herunter ..."
for f in _vimrc _vim.tar; do
    HTTP_CODE=$(curl -fsSL -w '%{http_code}' "$BASE_URL/$f" -o "$TMP_DIR/$f") || {
        echo "Fehler: Download von '$f' fehlgeschlagen (curl-Fehler)." >&2
        exit 1
    }
    if [[ "$HTTP_CODE" != "200" ]]; then
        echo "Fehler: Download von '$f' lieferte HTTP $HTTP_CODE." >&2
        exit 1
    fi
    if [[ ! -s "$TMP_DIR/$f" ]]; then
        echo "Fehler: '$f' wurde heruntergeladen, ist aber leer (0 Byte)." >&2
        exit 1
    fi
done
echo "Download ok. Größen:"
ls -l "$TMP_DIR"/_vimrc "$TMP_DIR"/_vim.tar

# Prüfen, ob es sich wirklich um ein gültiges tar-Archiv handelt
# (z.B. wenn der Server bei einem Fehler stattdessen eine HTML-Seite
# mit HTTP 200 zurückliefert, wäre die Datei kein echtes tar).
if ! tar -tf "$TMP_DIR/_vim.tar" >"$TMP_DIR/_vim_listing.txt" 2>&1; then
    echo "Fehler: '_vim.tar' ist kein gültiges tar-Archiv. Inhalt (erste Zeilen):" >&2
    head -c 300 "$TMP_DIR/_vim.tar" >&2
    echo >&2
    exit 1
fi

echo "Inhalt von _vim.tar:"
cat "$TMP_DIR/_vim_listing.txt"

echo "Entpacke _vim.tar ..."
mkdir -p "$TMP_DIR/vim_extracted"
tar -xf "$TMP_DIR/_vim.tar" -C "$TMP_DIR/vim_extracted"

# Top-Level-Einträge im entpackten Verzeichnis ermitteln, unabhängig
# davon, wie der Ordner im Archiv tatsächlich heißt.
mapfile -t TOP_ENTRIES < <(find "$TMP_DIR/vim_extracted" -mindepth 1 -maxdepth 1)

if [[ ${#TOP_ENTRIES[@]} -eq 0 ]]; then
    echo "Fehler: Nach dem Entpacken ist 'vim_extracted' leer." >&2
    exit 1
elif [[ ${#TOP_ENTRIES[@]} -eq 1 && -d "${TOP_ENTRIES[0]}" ]]; then
    # Genau ein Verzeichnis auf oberster Ebene -> das ist unser .vim
    VIM_SRC="${TOP_ENTRIES[0]}"
else
    # Mehrere Einträge bzw. Dateien direkt auf oberster Ebene
    # -> gesamtes Extraktionsverzeichnis ist der Inhalt von .vim
    VIM_SRC="$TMP_DIR/vim_extracted"
fi

echo "Verwende als Quelle für .vim: $VIM_SRC"

echo "Kopiere und benenne Dateien um ..."
cp "$TMP_DIR/_vimrc" "$HOME_DIR/.vimrc"
rm -rf "$HOME_DIR/.vim"
cp -r "$VIM_SRC" "$HOME_DIR/.vim"

chown "$USERNAME:$GROUP" "$HOME_DIR/.vimrc"
chown -R "$USERNAME:$GROUP" "$HOME_DIR/.vim"

# --- linuxlogo-Zeile an bestehende .bashrc anhängen --------------------------

BASHRC="$HOME_DIR/.bashrc"
LINUXLOGO_LINE='if [ -f /usr/bin/linuxlogo ]; then linuxlogo ;fi'
UNAME_LINE='lsb_release -a'

touch "$BASHRC"
if ! grep -qxF "$LINUXLOGO_LINE" "$BASHRC"; then
    echo "$LINUXLOGO_LINE" >>"$BASHRC"
    echo "linuxlogo-Zeile an $BASHRC angehängt."
else
    echo "linuxlogo-Zeile ist bereits in $BASHRC vorhanden, überspringe."
fi
if ! grep -qxF "$UNAME_LINE" "$BASHRC"; then
    echo "$UNAME_LINE" >>"$BASHRC"
    echo "uname-Zeile an $BASHRC angehängt."
else
    echo "uname-Zeile ist bereits in $BASHRC vorhanden, überspringe."
fi
chown "$USERNAME:$GROUP" "$BASHRC"

echo "Fertig. .bashrc, .vimrc und .vim/ wurden in $HOME_DIR eingerichtet."
