#!/bin/bash

####################################################################
# SnowTV Player – Remote Reinstall via kexec + Preseed
#
# Startet einen unbeaufsichtigten Debian 13 Reinstall auf dem
# laufenden Player. Läuft via SSH direkt auf dem Zielgerät.
#
# Ablauf:
#   1. mcid + mcdomain aus bestehender Konfiguration lesen
#   2. SATA vs. NVMe erkennen → korrekten Preseed wählen
#   3. kexec-tools installieren
#   4. Debian 13 Netboot-Kernel + initrd herunterladen
#   5. kexec laden + ausführen → Installer bootet direkt
#
# Nach ~50 Min ist der Player mit Debian 13 neu installiert,
# meldet sich mit der gleichen ID beim Server und baut den
# Reverse-SSH-Tunnel wieder auf.
#
# ACHTUNG: Dieser Vorgang ist NICHT umkehrbar.
# Bei Netzwerkabbruch während der Installation ist physischer
# Zugriff auf das Gerät nötig.
####################################################################

BASE_URL="https://172.105.95.252"
NETBOOT_URL="https://deb.debian.org/debian/dists/trixie/main/installer-amd64/current/images/netboot/debian-installer/amd64"
WORK_DIR="/tmp/reinstall"
LOG="/tmp/reinstall.log"

_log()  { echo "$(date)  INFO: $*" | tee -a "$LOG"; }
_err()  { echo "$(date) ERROR: $*" | tee -a "$LOG"; exit 1; }
_warn() { echo "$(date)  WARN: $*" | tee -a "$LOG"; }

mkdir -p "$WORK_DIR"

_log "=== SnowTV Remote Reinstall ==="
_log "Läuft auf: $(hostname) | $(uname -r)"

# --- 1. mcid lesen (mcid.cfg → mc.cfg → manuelle Eingabe) ---
MCID=$(grep '^ID=' /home/snowtv/bin/mcid.cfg 2>/dev/null | cut -d= -f2 | tr -d '\r')
if [ -z "$MCID" ] || [ "$MCID" = "102" ]; then
    _warn "mcid.cfg fehlt oder Default (102) – suche in mc.cfg..."
    MCID=$(grep '^ID=' /home/snowtv/bin/mc.cfg 2>/dev/null | cut -d= -f2 | awk '{print $1}' | tr -d '\r')
fi
if [ -z "$MCID" ] || [ "$MCID" = "102" ]; then
    _warn "ID auch in mc.cfg nicht gefunden oder Default."
    echo ""
    echo "  Bitte die Player-ID manuell eingeben (steht auf dem Etikett"
    echo "  des Geräts oder im infosnow.ch-Backend):"
    read -r -p "  Player-ID: " MCID
fi
if [ -z "$MCID" ] || ! [[ "$MCID" =~ ^[1-9][0-9]{0,2}$ ]]; then
    _err "Keine gültige Player-ID (1–999) – Abbruch."
fi
_log "Player-ID: $MCID"

# --- 2. mcdomain lesen (mcdomain.cfg → mc.cfg → manuelle Auswahl) ---
MCDOMAIN=$(grep '^DOMAIN=' /home/snowtv/bin/mcdomain.cfg 2>/dev/null | cut -d= -f2 | tr -d '\r')
if [ -z "$MCDOMAIN" ]; then
    _warn "mcdomain.cfg fehlt – suche in mc.cfg..."
    # mc.cfg enthält keine DOMAIN-Zeile, aber ggf. in älteren Systemen die URL
    MCDOMAIN=$(grep '^DOMAIN=' /home/snowtv/bin/mc.cfg 2>/dev/null | cut -d= -f2 | awk '{print $1}' | tr -d '\r')
fi
if [ -z "$MCDOMAIN" ]; then
    _warn "Domain nicht gefunden – bitte manuell wählen."
    echo ""
    echo "  Welche SnowTV-Instanz?"
    select INST in "infosnow (https://infosnow.ch)" "zbag (https://infosnow.zbag.ch)" "Andere"; do
        case $INST in
            "infosnow (https://infosnow.ch)")   MCDOMAIN="https://infosnow.ch"; break ;;
            "zbag (https://infosnow.zbag.ch)") MCDOMAIN="https://infosnow.zbag.ch"; break ;;
            "Andere")
                read -r -p "  Domain eingeben (z.B. https://infosnow.ch): " MCDOMAIN
                break ;;
            *) echo "Ungültige Auswahl" ;;
        esac
    done
fi
if [ -z "$MCDOMAIN" ]; then
    _err "Keine Domain – Abbruch."
fi
_log "Domain: $MCDOMAIN"

# --- 3. SATA vs. NVMe erkennen ---
if [ -e /dev/nvme0n1 ]; then
    DISK="/dev/nvme0n1"
    PRESEED_URL="${BASE_URL}/preseed_nvme.cfg"
    _log "Disk: NVMe ($DISK) → preseed_nvme.cfg"
elif [ -e /dev/sda ]; then
    DISK="/dev/sda"
    PRESEED_URL="${BASE_URL}/preseed_sata.cfg"
    _log "Disk: SATA ($DISK) → preseed_sata.cfg"
else
    _err "Weder /dev/nvme0n1 noch /dev/sda gefunden – Abbruch."
fi

# --- 4. Bestätigung ---
echo ""
echo "########################################################"
echo "#  ACHTUNG – DIESER VORGANG LÖSCHT DAS SYSTEM          #"
echo "########################################################"
echo ""
echo "  Player-ID  : $MCID"
echo "  Domain     : $MCDOMAIN"
echo "  Disk       : $DISK"
echo "  Preseed    : $PRESEED_URL"
echo ""
echo "  Der Player wird mit Debian 13 neu installiert."
echo "  Nach ~50 Min meldet er sich mit ID $MCID wieder."
echo ""
read -r -p "  Fortfahren? (ja/NEIN): " CONFIRM
if [ "$CONFIRM" != "ja" ]; then
    echo "Abgebrochen."
    exit 0
fi

# --- 5. EOL-Sources patchen (Buster, Stretch, etc.) ---
_fix_eol_sources() {
    local CODENAME
    CODENAME=$(grep -oP '(?<=DISTRIB_CODENAME=)\S+' /etc/lsb-release 2>/dev/null \
               || . /etc/os-release 2>/dev/null && echo "$VERSION_CODENAME")
    case "$CODENAME" in
        jessie|stretch|buster)
            _warn "EOL-System erkannt ($CODENAME) – wechsle auf archive.debian.org..."
            sudo tee /etc/apt/sources.list > /dev/null << EOF
deb http://archive.debian.org/debian ${CODENAME} main contrib non-free
deb http://archive.debian.org/debian-security ${CODENAME}/updates main contrib non-free
EOF
            sudo apt-get update -qq >> "$LOG" 2>&1 \
                || _err "apt-get update auf archive.debian.org fehlgeschlagen."
            _log "Sources auf archive.debian.org umgestellt."
            ;;
        *)
            sudo apt-get update -qq >> "$LOG" 2>&1 \
                || _err "apt-get update fehlgeschlagen – Netz prüfen."
            ;;
    esac
}
_fix_eol_sources

# --- 6. kexec-tools installieren ---
_log "kexec-tools installieren..."
sudo apt-get install -y kexec-tools >> "$LOG" 2>&1 || _err "kexec-tools Installation fehlgeschlagen"

# --- 7. Debian 13 Netboot-Kernel + initrd herunterladen ---
_log "Lade Debian 13 Netboot-Kernel..."
wget -q --show-progress -O "$WORK_DIR/vmlinuz"   "${NETBOOT_URL}/linux"   || _err "vmlinuz Download fehlgeschlagen"
wget -q --show-progress -O "$WORK_DIR/initrd.gz" "${NETBOOT_URL}/initrd.gz" || _err "initrd.gz Download fehlgeschlagen"
_log "Download abgeschlossen: $(du -sh $WORK_DIR/vmlinuz $WORK_DIR/initrd.gz | awk '{print $1, $2}' | tr '\n' ' ')"

# --- 8. kexec laden ---
_log "kexec laden..."
sudo kexec -l "$WORK_DIR/vmlinuz" \
    --initrd="$WORK_DIR/initrd.gz" \
    --append="auto=true priority=critical \
              url=${PRESEED_URL} \
              mcid=${MCID} \
              mcdomain=${MCDOMAIN} \
              DEBCONF_DEBUG=5 \
              --- quiet" \
    >> "$LOG" 2>&1 || _err "kexec -l fehlgeschlagen"

_log "kexec geladen. Starte Installer in 5 Sekunden..."
_log "Verbindung wird jetzt unterbrochen – das ist normal."
_log "Player ist nach ~50 Min unter Port 10${MCID} auf dem Jumpserver erreichbar."
sleep 5

# --- 9. kexec ausführen – ab hier kein Zurück ---
sudo kexec -e
