#!/bin/bash
# ============================================================================
# PointCab Renamer - Windows Build unter Linux (Docker-Methode)
# Version: 4.1.2
# ============================================================================
# 
# Dieses Skript erstellt eine Windows .exe unter Linux mittels Docker.
# Es verwendet das cdrx/pyinstaller-windows Image für zuverlässige Builds.
#
# VORAUSSETZUNGEN:
#   - Docker muss installiert sein (wird bei Bedarf mit sudo gestartet)
#   - Internet-Verbindung für den ersten Docker-Image-Download
#
# VERWENDUNG:
#   ./build_windows_on_linux.sh
#
# TROUBLESHOOTING:
#   Falls Docker nicht startet, prüfen Sie:
#   - sudo systemctl start docker
#   - Benutzer zur docker-Gruppe hinzufügen: sudo usermod -aG docker $USER
#   - In Container-Umgebungen (z.B. Docker-in-Docker): --privileged Flag nötig
#
# ============================================================================

set -e  # Bei Fehlern abbrechen

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

# Banner
echo -e "${BLUE}"
echo "============================================================================"
echo "  PointCab Renamer - Windows Cross-Compilation unter Linux"
echo "  Version 4.1.2"
echo "============================================================================"
echo -e "${NC}"

# Hilfsfunktion: Docker-Befehl mit oder ohne sudo
docker_cmd() {
    if docker "$@" 2>/dev/null; then
        return 0
    elif sudo docker "$@" 2>/dev/null; then
        USE_SUDO=1
        return 0
    else
        return 1
    fi
}

run_docker() {
    if [ "$USE_SUDO" = "1" ]; then
        sudo docker "$@"
    else
        docker "$@"
    fi
}

# [1/7] Prüfe ob Docker installiert ist
echo -e "${YELLOW}[1/7] Prüfe Docker-Installation...${NC}"
if ! command -v docker &> /dev/null; then
    echo -e "${RED}FEHLER: Docker ist nicht installiert!${NC}"
    echo ""
    echo "Installiere Docker mit:"
    echo "  Ubuntu/Debian:"
    echo "    sudo apt update"
    echo "    sudo apt install docker.io"
    echo "    sudo systemctl start docker"
    echo "    sudo systemctl enable docker"
    echo "    sudo usermod -aG docker \$USER"
    echo "    # Danach neu einloggen oder: newgrp docker"
    echo ""
    echo "  Fedora/RHEL:"
    echo "    sudo dnf install docker"
    echo "    sudo systemctl start docker"
    echo ""
    echo "Alternativ: Verwende ./build_windows_wine.sh (Wine-basiert)"
    exit 1
fi
echo -e "${GREEN}✓ Docker ist installiert${NC}"

# [2/7] Prüfe ob Docker-Daemon läuft, versuche Start mit sudo falls nötig
echo -e "${YELLOW}[2/7] Prüfe Docker-Daemon...${NC}"
USE_SUDO=0

if docker info &> /dev/null; then
    echo -e "${GREEN}✓ Docker-Daemon läuft (ohne sudo)${NC}"
elif sudo docker info &> /dev/null; then
    USE_SUDO=1
    echo -e "${GREEN}✓ Docker-Daemon läuft (mit sudo)${NC}"
else
    # Versuche Docker zu starten
    echo -e "${YELLOW}Docker-Daemon läuft nicht. Versuche zu starten...${NC}"
    
    # Versuche systemd
    if command -v systemctl &> /dev/null; then
        sudo systemctl start docker 2>/dev/null && sleep 2
    fi
    
    # Prüfe erneut
    if docker info &> /dev/null; then
        echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet${NC}"
    elif sudo docker info &> /dev/null; then
        USE_SUDO=1
        echo -e "${GREEN}✓ Docker-Daemon erfolgreich gestartet (mit sudo)${NC}"
    else
        echo -e "${RED}FEHLER: Docker-Daemon konnte nicht gestartet werden!${NC}"
        echo ""
        echo "Mögliche Ursachen und Lösungen:"
        echo ""
        echo "1. Docker-Service nicht gestartet:"
        echo "   sudo systemctl start docker"
        echo ""
        echo "2. Berechtigungsproblem:"
        echo "   sudo usermod -aG docker \$USER"
        echo "   # Dann neu einloggen"
        echo ""
        echo "3. In Container-Umgebung (Docker-in-Docker):"
        echo "   Docker kann nicht in unprivilegierten Containern laufen."
        echo "   Nutze stattdessen: ./build_windows_wine.sh"
        echo "   Oder: Baue auf einem System mit nativem Docker."
        echo ""
        echo "4. WSL2 unter Windows:"
        echo "   Starte Docker Desktop und aktiviere WSL2-Integration."
        echo ""
        echo "Alternative Build-Methoden:"
        echo "  - ./build_windows_wine.sh (Wine-basiert)"
        echo "  - GitHub Actions (siehe .github/workflows/)"
        echo "  - Natives Windows: build_windows.bat"
        exit 1
    fi
fi

# Arbeitsverzeichnis
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# [3/7] Prüfe ob notwendige Dateien existieren
echo -e "${YELLOW}[3/7] Prüfe Projektdateien...${NC}"
if [ ! -f "pointcab_renamer.py" ]; then
    echo -e "${RED}FEHLER: pointcab_renamer.py nicht gefunden!${NC}"
    echo "Stelle sicher, dass du dich im richtigen Verzeichnis befindest."
    exit 1
fi

if [ ! -f "cluster_cleanup.txt" ]; then
    echo -e "${RED}FEHLER: cluster_cleanup.txt nicht gefunden!${NC}"
    exit 1
fi
echo -e "${GREEN}✓ Alle Projektdateien vorhanden${NC}"

# [4/7] Aufräumen
echo -e "${YELLOW}[4/7] Räume alte Build-Artefakte auf...${NC}"
rm -rf build/ dist/ *.spec 2>/dev/null || true
mkdir -p dist
echo -e "${GREEN}✓ Build-Verzeichnisse bereinigt${NC}"

# Docker Image
DOCKER_IMAGE="cdrx/pyinstaller-windows:python3"

# [5/7] Prüfe/Lade Docker Image
echo -e "${YELLOW}[5/7] Prüfe Docker Image...${NC}"
echo "    Image: $DOCKER_IMAGE"
echo "    (Beim ersten Mal wird ~1.5 GB heruntergeladen)"

if ! run_docker image inspect "$DOCKER_IMAGE" &> /dev/null; then
    echo ""
    echo "Lade Docker Image herunter..."
    run_docker pull "$DOCKER_IMAGE"
fi
echo -e "${GREEN}✓ Docker Image bereit${NC}"

# [6/7] Build durchführen
echo -e "${YELLOW}[6/7] Erstelle Windows .exe mit PyInstaller...${NC}"
echo "    Dies kann 2-5 Minuten dauern..."
echo ""

# Erstelle temporäres Build-Skript für Docker-Container
BUILD_SCRIPT=$(mktemp)
cat > "$BUILD_SCRIPT" << 'DOCKERSCRIPT'
#!/bin/bash
set -e
cd /src

echo "=== Docker Container gestartet ==="
echo "Python-Version: $(python --version)"
echo "PyInstaller-Version: $(pip show pyinstaller | grep Version)"
echo ""

# Installiere requirements falls vorhanden
if [ -f "requirements.txt" ]; then
    echo "Installiere requirements..."
    pip install -r requirements.txt --quiet
fi

echo "Starte PyInstaller Build..."

# PyInstaller Build
pyinstaller --onefile \
    --windowed \
    --name "PointCab_Renamer" \
    --add-data "cluster_cleanup.txt;." \
    --add-data "BENUTZERHANDBUCH.md;." \
    --icon="NONE" \
    --clean \
    pointcab_renamer.py

echo ""
echo "=== Build im Container abgeschlossen ==="
DOCKERSCRIPT

chmod +x "$BUILD_SCRIPT"

# Docker Container ausführen
if [ "$USE_SUDO" = "1" ]; then
    sudo docker run --rm \
        -v "$SCRIPT_DIR":/src \
        -v "$BUILD_SCRIPT":/docker_build.sh:ro \
        "$DOCKER_IMAGE" \
        bash /docker_build.sh
else
    docker run --rm \
        -v "$SCRIPT_DIR":/src \
        -v "$BUILD_SCRIPT":/docker_build.sh:ro \
        "$DOCKER_IMAGE" \
        bash /docker_build.sh
fi

# Aufräumen
rm -f "$BUILD_SCRIPT"

# [7/7] Prüfe Ergebnis
echo ""
echo -e "${YELLOW}[7/7] Verifiziere Build-Ergebnis...${NC}"

if [ -f "dist/PointCab_Renamer.exe" ]; then
    echo -e "${GREEN}✓ Windows .exe erfolgreich erstellt!${NC}"
    
    # Kopiere zusätzliche Dateien
    cp cluster_cleanup.txt dist/
    [ -f "BENUTZERHANDBUCH.md" ] && cp BENUTZERHANDBUCH.md dist/
    [ -f "BENUTZERHANDBUCH.pdf" ] && cp BENUTZERHANDBUCH.pdf dist/
    [ -f "README.md" ] && cp README.md dist/
    [ -f "LICENSE.txt" ] && cp LICENSE.txt dist/
    
    # Zeige Ergebnis
    echo ""
    echo -e "${BLUE}============================================================================${NC}"
    echo -e "${GREEN}BUILD ERFOLGREICH!${NC}"
    echo -e "${BLUE}============================================================================${NC}"
    echo ""
    echo "Erstellte Dateien in dist/:"
    ls -lh dist/
    echo ""
    EXE_SIZE=$(du -h "dist/PointCab_Renamer.exe" | cut -f1)
    echo "Executable-Größe: $EXE_SIZE"
    echo ""
    echo "Pfad: $SCRIPT_DIR/dist/"
    echo ""
    echo -e "${YELLOW}WICHTIG:${NC}"
    echo "  1. Teste die .exe auf einem echten Windows-System!"
    echo "  2. Stelle sicher, dass cluster_cleanup.txt im gleichen"
    echo "     Ordner wie die .exe liegt."
    echo ""
else
    echo -e "${RED}FEHLER: Build fehlgeschlagen!${NC}"
    echo ""
    echo "Die Datei dist/PointCab_Renamer.exe wurde nicht erstellt."
    echo ""
    echo "Prüfe die Fehlermeldungen oben und versuche:"
    echo "  1. ./build_windows_wine.sh (Wine-Alternative)"
    echo "  2. Build auf nativem Windows mit build_windows.bat"
    echo ""
    exit 1
fi
