#!/usr/bin/env bash
#
#    $file:setup_user_env.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:
#
# Kopiert Standard-Konfigurationsdateien (.bashrc, .vimrc, .vim/) aus
# https://unblog.ch/arch/rc/ in das Home-Verzeichnis eines (neu erstellten)
# Benutzers.
#
# Verwendung:
#   sudo ./setup_user_env.sh <benutzername>
#
set -euo pipefail

BASE_URL="https://unblog.ch/arch/rc"
FILES=("_vimrc" "_vim.tar")

# --- Voraussetzungen prüfen -------------------------------------------------

if [[ $EUID -ne 0 ]]; then
    echo "Fehler: Dieses Skript muss als root (bzw. mit sudo) ausgeführt werden." >&2
    exit 1
fi

if [[ $# -ne 1 ]]; then
    echo "Verwendung: $0 <benutzername>" >&2
    exit 1
fi

USERNAME="$1"

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"

# --- Temporäres Arbeitsverzeichnis ------------------------------------------

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

# --- Dateien herunterladen ---------------------------------------------------

echo "Lade Vorlagendateien von $BASE_URL herunter ..."
for f in "${FILES[@]}"; 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

# --- _vim.tar prüfen und entpacken -------------------------------------------

# 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"

# --- Dateien ins Home-Verzeichnis kopieren und umbenennen --------------------

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"

# --- Besitzrechte korrigieren -------------------------------------------------

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'

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
chown "$USERNAME:$GROUP" "$BASHRC"

echo "Fertig. .vimrc, .vim/ und die linuxlogo-Zeile in .bashrc wurden in $HOME_DIR eingerichtet."
