#!/bin/sh

# Farbdefinitionen für schönere Ausgabe
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Prüfe, ob das Script mit Root-Rechten ausgeführt wird
check_root() {
    if [ "$(id -u)" != "0" ]; then
        printf "${RED}Dieses Script benötigt Root-Rechte für Installationen.${NC}\n"
        printf "Bitte starte es erneut mit: sudo $0\n"
        exit 1
    fi
}

# Funktion zur Erkennung des Paketmanagers
detect_package_manager() {
    if command -v apt >/dev/null 2>&1; then
        echo "apt"
    elif command -v dnf >/dev/null 2>&1; then
        echo "dnf"
    elif command -v yum >/dev/null 2>&1; then
        echo "yum"
    elif command -v pacman >/dev/null 2>&1; then
        echo "pacman"
    elif command -v zypper >/dev/null 2>&1; then
        echo "zypper"
    elif command -v apk >/dev/null 2>&1; then
        echo "apk"
    else
        echo "unknown"
    fi
}

# Funktion zur Installation eines Pakets
install_package() {
    local pkg_manager=$1
    local pkg_name=$2

    printf "${BLUE}Installiere $pkg_name...${NC}\n"

    case $pkg_manager in
        apt)
            apt install -y $pkg_name
            ;;
        dnf|yum)
            $pkg_manager install -y $pkg_name
            ;;
        pacman)
            pacman -S --noconfirm $pkg_name
            ;;
        zypper)
            zypper install -y $pkg_name
            ;;
        apk)
            apk add $pkg_name
            ;;
        *)
            printf "${RED}Unbekannter Paketmanager. Installation nicht möglich.${NC}\n"
            return 1
            ;;
    esac

    if [ $? -eq 0 ]; then
        printf "${GREEN}$pkg_name erfolgreich installiert.${NC}\n"
        return 0
    else
        printf "${RED}Fehler bei der Installation von $pkg_name.${NC}\n"
        return 1
    fi
}

# Hauptprogramm
printf "${BLUE}=== Überprüfung der Systemvoraussetzungen ===${NC}\n\n"

# Erkenne den Paketmanager
PKG_MANAGER=$(detect_package_manager)
if [ "$PKG_MANAGER" = "unknown" ]; then
    printf "${RED}Konnte keinen bekannten Paketmanager erkennen.${NC}\n"
    echo "Bitte installiere fehlende Pakete manuell."
    exit 1
else
    echo "Erkannter Paketmanager: $PKG_MANAGER"
fi

# Initialisiere Variable für fehlende Pakete
missing_packages=""
missing_ssh=false

# 1. Prüfe bash
printf "Prüfe bash... "
if command -v bash >/dev/null 2>&1; then
    printf "${GREEN}Vorhanden ✓${NC}\n"
else
    printf "${RED}Nicht gefunden ✗${NC}\n"
    missing_packages="$missing_packages bash"
fi

# 2. Prüfe python3
printf "Prüfe python3... "
if command -v python3 >/dev/null 2>&1; then
    printf "${GREEN}Vorhanden ✓${NC}\n"
else
    printf "${RED}Nicht gefunden ✗${NC}\n"
    python_pkg="python3"
    [ "$PKG_MANAGER" = "pacman" ] && python_pkg="python"
    missing_packages="$missing_packages $python_pkg"
fi

# 3. Prüfe sudo
printf "Prüfe sudo... "
if command -v sudo >/dev/null 2>&1; then
    printf "${GREEN}Vorhanden ✓${NC}\n"
else
    printf "${RED}Nicht gefunden ✗${NC}\n"
    missing_packages="$missing_packages sudo"
fi

# 4. Prüfe openssh-server
printf "Prüfe openssh-server... "
if systemctl status sshd >/dev/null 2>&1 \
   || service ssh status >/dev/null 2>&1 \
   || ps aux | grep -v grep | grep -q sshd; then
    printf "${GREEN}Vorhanden ✓${NC}\n"
else
    printf "${RED}Nicht gefunden ✗${NC}\n"
    missing_ssh=true
    ssh_pkg="openssh-server"
    case $PKG_MANAGER in
        pacman|apk) ssh_pkg="openssh" ;;
    esac
    missing_packages="$missing_packages $ssh_pkg"
fi

# Installation der fehlenden Pakete (ohne Rückfrage)
if [ -n "$missing_packages" ]; then
    echo
    printf "${BLUE}Starte Installation der fehlenden Pakete...${NC}\n\n"
    check_root

    # Bei Alpine: community-Repo für sudo aktivieren
    if [ "$PKG_MANAGER" = "apk" ]; then
        printf "${BLUE}Aktiviere community-Repository für sudo...${NC}\n"
        # Alpine-Version ermitteln, z.B. "3.18"
        ALPINE_VER=$(cut -d. -f1-2 /etc/alpine-release)
        REPO_URL="http://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VER}/community"
        # Falls noch nicht vorhanden, hinzufügen
        grep -qxF "$REPO_URL" /etc/apk/repositories || \
            echo "$REPO_URL" >> /etc/apk/repositories
    fi

    printf "${BLUE}Aktualisiere Paketlisten...${NC}\n"
    case $PKG_MANAGER in
        apt)
            apt update
            ;;
        dnf|yum)
            $PKG_MANAGER check-update || true
            ;;
        pacman)
            pacman -Sy
            ;;
        zypper)
            zypper refresh
            ;;
        apk)
            apk update
            ;;
    esac
    echo

    for pkg in $missing_packages; do
        install_package "$PKG_MANAGER" "$pkg"
    done

    # SSH-Server starten, falls nötig
    if [ "$missing_ssh" = "true" ]; then
        printf "${BLUE}Starte SSH-Server...${NC}\n"
        if command -v systemctl >/dev/null 2>&1; then
            systemctl enable --now sshd || systemctl enable --now ssh
        elif command -v service >/dev/null 2>&1; then
            service ssh start || service sshd start
        else
            printf "${YELLOW}Konnte SSH-Server nicht automatisch starten.${NC}\n"
            echo "Bitte starte den SSH-Server manuell."
        fi
    fi

    # Abschließende Überprüfung
    echo
    printf "${BLUE}=== Abschließende Überprüfung ===${NC}\n\n"

    all_requirements_met=true

    printf "bash: "
    command -v bash >/dev/null 2>&1 \
        && printf "${GREEN}Vorhanden ✓${NC}\n" \
        || { printf "${RED}Fehlt trotz Installationsversuch!${NC}\n"; all_requirements_met=false; }

    printf "python3: "
    command -v python3 >/dev/null 2>&1 \
        && printf "${GREEN}Vorhanden ✓${NC}\n" \
        || { printf "${RED}Fehlt trotz Installationsversuch!${NC}\n"; all_requirements_met=false; }

    printf "sudo: "
    command -v sudo >/dev/null 2>&1 \
        && printf "${GREEN}Vorhanden ✓${NC}\n" \
        || { printf "${RED}Fehlt trotz Installationsversuch!${NC}\n"; all_requirements_met=false; }

    printf "openssh-server: "
    ( systemctl status sshd >/dev/null 2>&1 \
      || service ssh status >/dev/null 2>&1 \
      || ps aux | grep -v grep | grep -q sshd ) \
        && printf "${GREEN}Vorhanden ✓${NC}\n" \
        || { printf "${RED}Fehlt trotz Installationsversuch!${NC}\n"; all_requirements_met=false; }

    echo
    if $all_requirements_met; then
        printf "${GREEN}Alle Voraussetzungen sind erfüllt. System ist bereit!${NC}\n"
    else
        printf "${RED}Nicht alle Voraussetzungen konnten installiert werden.${NC}\n"
        echo "Bitte installiere die fehlenden Pakete manuell."
        exit 1
    fi

else
    echo
    printf "${GREEN}Alle Voraussetzungen sind bereits erfüllt. Keine Installation notwendig.${NC}\n"
fi
