#!/bin/bash
# ============================================================================
# bootstrap-macbook.sh -- Erststart-Bootstrap fuer neue MacBooks
# ============================================================================
# Der EINZIGE manuelle Schritt am neuen Geraet (nach dem Setup-Assistenten,
# angemeldet als der im Assistenten angelegte Admin-Hauptnutzer).
#
# WICHTIG VORHER (im Setup-Assistenten, nicht nachholbar per Script):
#   - FileVault direkt beim Einrichten des Nutzerkontos AKTIVIEREN
#     ("Setup Encryption when configuring user account")
#
# Aufruf im Terminal (Script z.B. von files.digitec.de laden):
#   curl -fsSL https://files.digitec.de/macos/bootstrap-macbook.sh -o /tmp/bootstrap-macbook.sh
#   sudo bash /tmp/bootstrap-macbook.sh
#
# Macht (Pendant zu bootstrap-notebook.ps1 auf Windows):
#   1. Xcode Command Line Tools headless installieren (liefert /usr/bin/python3,
#      ohne das kann Ansible keine Module ausfuehren)
#   2. Automation-User "alfred" anlegen (Admin, versteckt am Login-Fenster,
#      MIT SecureToken -- dafuer wird das Passwort des Hauptnutzers abgefragt).
#      alfred-Passwort wird abgefragt -> Wert aus/nach KeePass
#      ("<devicename>.hh.digitec.de / alfred", wie bei den Windows-Notebooks)
#   3. SSH (Remote Login) aktivieren + Public Key des Ansible-Controllers
#      (az-it-automation) fuer alfred hinterlegen
#   4. sudo ohne Passwort fuer alfred (noetig fuer become + Homebrew-Install)
#   5. Ruhezustand deaktivieren, damit das Geraet waehrend des Onboardings
#      nicht einschlaeft (Playbook stellt am Ende die Defaults wieder her)
#
# Danach zeigt es die IP-Adresse(n) an. Diese IP beim Playbook-Start
# auf az-it-automation eingeben:
#   ansible-playbook playbooks/workstation/onboard-macbook.yml
# ============================================================================
set -uo pipefail

ADMIN_USER="alfred"
# Ueberschreibbar fuer Tests: sudo PUBKEY_URL=http://... bash bootstrap-macbook.sh
PUBKEY_URL="${PUBKEY_URL:-https://files.digitec.de/macos/az-it-automation.pub}"

if [ "$(id -u)" -ne 0 ]; then
    echo "Bitte mit sudo ausfuehren: sudo bash $0" >&2
    exit 1
fi
# Der Nutzer, der sudo aufgerufen hat (= Admin-Hauptnutzer aus dem Setup-Assistenten)
MAIN_USER="${SUDO_USER:-$(stat -f%Su /dev/console)}"

echo "=== Digitec MacBook-Bootstrap ==="

# --- 1. Xcode Command Line Tools (headless, ohne GUI-Dialog) ----------------
if xcode-select -p >/dev/null 2>&1; then
    echo "Command Line Tools bereits installiert"
else
    echo "Installiere Command Line Tools (dauert einige Minuten)..."
    # Temp-Datei laesst die CLT im softwareupdate-Katalog auftauchen
    touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
    CLT_LABEL=$(softwareupdate -l 2>/dev/null \
        | sed -n 's/^\* Label: \(Command Line Tools.*\)$/\1/p' | tail -1)
    if [ -n "$CLT_LABEL" ]; then
        softwareupdate -i "$CLT_LABEL" --verbose
    else
        echo "WARNUNG: CLT-Label nicht gefunden -- bitte manuell: xcode-select --install" >&2
    fi
    rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
fi

# --- 2. Automation-User alfred (Admin, versteckt, mit SecureToken) ----------
# Initial-Passwort = der Windows-Standard (wie bootstrap-notebook.ps1) --
# das Onboarding-Playbook rotiert es sofort auf ein Pro-Geraet-Passwort
# und legt dieses in KeePass ab (<devicename>.hh.digitec.de / alfred).
if id "$ADMIN_USER" >/dev/null 2>&1; then
    echo "User $ADMIN_USER existiert bereits"
else
    # Admin-Passwort des Hauptnutzers noetig, damit alfred einen SecureToken
    # bekommt (sonst spaeter keine FileVault-/OS-Update-Autorisierung moeglich)
    read -r -s -p "Passwort des angemeldeten Admins ($MAIN_USER) fuer SecureToken: " MAIN_PW; echo
    sysadminctl -addUser "$ADMIN_USER" -fullName "Alfred Admin" \
        -password "DLRxuRa8" -admin \
        -adminUser "$MAIN_USER" -adminPassword "$MAIN_PW"
    unset MAIN_PW
    # Am Login-Fenster verstecken (reiner Automation-Account)
    dscl . create "/Users/$ADMIN_USER" IsHidden 1
    echo "User $ADMIN_USER angelegt (Admin, versteckt, Initial-Passwort)"
fi

# --- 3. SSH aktivieren + Controller-Key hinterlegen --------------------------
systemsetup -setremotelogin on >/dev/null 2>&1 || true
echo "Remote Login (SSH): $(systemsetup -getremotelogin 2>/dev/null)"

ALFRED_HOME=$(dscl . -read "/Users/$ADMIN_USER" NFSHomeDirectory | awk '{print $2}')
mkdir -p "$ALFRED_HOME/.ssh"
if curl -fsSL "$PUBKEY_URL" >> "$ALFRED_HOME/.ssh/authorized_keys" 2>/dev/null; then
    sort -u "$ALFRED_HOME/.ssh/authorized_keys" -o "$ALFRED_HOME/.ssh/authorized_keys"
    echo "Controller-Public-Key hinterlegt"
else
    echo "WARNUNG: Public Key nicht ladbar ($PUBKEY_URL)." >&2
    echo "         Playbook dann mit -e ansible_password=<alfred-PW> starten (braucht sshpass)." >&2
fi
chown -R "$ADMIN_USER" "$ALFRED_HOME/.ssh"
chmod 700 "$ALFRED_HOME/.ssh"
chmod 600 "$ALFRED_HOME/.ssh/authorized_keys" 2>/dev/null || true

# --- 4. sudo ohne Passwort fuer alfred ---------------------------------------
echo "$ADMIN_USER ALL=(ALL) NOPASSWD: ALL" > "/etc/sudoers.d/$ADMIN_USER"
chmod 440 "/etc/sudoers.d/$ADMIN_USER"
visudo -c >/dev/null && echo "sudoers-Eintrag fuer $ADMIN_USER ok"

# --- 5. Nicht einschlafen waehrend des Onboardings ---------------------------
pmset -a sleep 0 displaysleep 0 disksleep 0
echo "Ruhezustand deaktiviert (Playbook stellt Defaults am Ende wieder her)"

# --- Abschluss: Infos fuers Playbook -----------------------------------------
echo ""
echo "=== Bootstrap fertig ==="
echo "Seriennummer: $(system_profiler SPHardwareDataType 2>/dev/null | awk -F': ' '/Serial Number/ {print $2}')"
echo "FileVault:    $(fdesetup status)"
fdesetup status | grep -q "is On" || \
    echo "  !! FileVault ist AUS -- bitte in Systemeinstellungen > Datenschutz aktivieren !!"
echo "IP-Adresse(n) fuer den Playbook-Start:"
for IF in $(ifconfig -l); do
    IP=$(ipconfig getifaddr "$IF" 2>/dev/null) && echo "  $IF: $IP"
done
echo ""
echo "Hinweis: App-Store-Login (Apple-ID) ist nur noetig, wenn das Playbook"
echo "mit -e install_office_source=appstore laufen soll -- der Default"
echo "installiert Office direkt von Microsoft, ganz ohne Apple-ID."
echo ""
echo "Jetzt auf az-it-automation starten:"
echo "  ansible-playbook playbooks/workstation/onboard-macbook.yml"
