#!/bin/bash
#
# STARFACE API Libraries Fetcher
# Holt die benötigten JARs und Klassen von einer STARFACE Installation via SCP
#
# Verwendung:
#   ./fetch-starface-libs.sh <starface-host> [user] [target-dir]
#
# Beispiele:
#   ./fetch-starface-libs.sh 192.168.1.100
#   ./fetch-starface-libs.sh starface.firma.local root
#   ./fetch-starface-libs.sh 10.0.0.5 root v8-9-10/libs/starface
#

set -e

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

# Argumente
STARFACE_HOST="${1:-}"
SSH_USER="${2:-root}"
TARGET_DIR="${3:-v8-9-10/libs/starface}"

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

echo -e "${BLUE}========================================"
echo " STARFACE API Libraries Fetcher"
echo -e "========================================${NC}"
echo ""

# Hilfe anzeigen
if [ -z "$STARFACE_HOST" ] || [ "$STARFACE_HOST" == "-h" ] || [ "$STARFACE_HOST" == "--help" ]; then
    echo "Verwendung: $0 <starface-host> [user] [target-dir]"
    echo ""
    echo "Argumente:"
    echo "  starface-host  IP-Adresse oder Hostname der STARFACE (erforderlich)"
    echo "  user           SSH-Benutzer (Standard: root)"
    echo "  target-dir     Zielverzeichnis für die JARs (Standard: v8-9-10/libs/starface)"
    echo ""
    echo "Beispiele:"
    echo "  $0 192.168.1.100"
    echo "  $0 starface.firma.local root"
    echo "  $0 10.0.0.5 root v8-9-10/libs/starface"
    echo ""
    echo "Voraussetzungen:"
    echo "  - SSH-Zugang zur STARFACE (root oder sudo-Benutzer)"
    echo "  - SSH-Key oder Passwort-Authentifizierung"
    echo ""
    echo "Tipp: SSH-Key einrichten für passwortloses Login:"
    echo "  ssh-copy-id root@<starface-host>"
    exit 0
fi

echo -e "STARFACE Host: ${GREEN}$STARFACE_HOST${NC}"
echo -e "SSH User:      ${GREEN}$SSH_USER${NC}"
echo -e "Zielordner:    ${GREEN}$TARGET_DIR${NC}"
echo ""

# Zielverzeichnis erstellen
mkdir -p "$TARGET_DIR"

# STARFACE Version und Pfade ermitteln
echo -e "${YELLOW}Ermittle STARFACE Version...${NC}"

STARFACE_VERSION=$(ssh -o ConnectTimeout=10 "${SSH_USER}@${STARFACE_HOST}" \
    "cat /etc/starface-release 2>/dev/null || head -1 /opt/starface/version.txt 2>/dev/null || echo 'unknown'" 2>/dev/null || echo "connection-failed")

if [ "$STARFACE_VERSION" == "connection-failed" ]; then
    echo -e "${RED}Fehler: Konnte keine Verbindung zu $STARFACE_HOST herstellen${NC}"
    echo ""
    echo "Mögliche Ursachen:"
    echo "  - Falscher Hostname/IP"
    echo "  - SSH-Dienst nicht erreichbar"
    echo "  - Firewall blockiert Port 22"
    echo ""
    echo "Prüfe die Verbindung mit: ssh ${SSH_USER}@${STARFACE_HOST}"
    exit 1
fi

echo -e "STARFACE Version: ${GREEN}$STARFACE_VERSION${NC}"
echo ""

# Pfade
LIB_PATH="/opt/tomcat/webapps/localhost/starface/WEB-INF/lib"
CLASSES_PATH="/opt/tomcat/webapps/localhost/starface/WEB-INF/classes"

# Prüfen welcher Pfad existiert
echo -e "${YELLOW}Prüfe Verzeichnisstruktur...${NC}"

ACTUAL_LIB_PATH=$(ssh "${SSH_USER}@${STARFACE_HOST}" \
    "if [ -d '$LIB_PATH' ]; then echo '$LIB_PATH'; fi" 2>/dev/null)

ACTUAL_CLASSES_PATH=$(ssh "${SSH_USER}@${STARFACE_HOST}" \
    "if [ -d '$CLASSES_PATH' ]; then echo '$CLASSES_PATH'; fi" 2>/dev/null)

if [ -z "$ACTUAL_LIB_PATH" ]; then
    echo -e "${RED}Fehler: STARFACE Bibliotheksverzeichnis nicht gefunden${NC}"
    exit 1
fi

echo -e "Bibliothekspfad: ${GREEN}$ACTUAL_LIB_PATH${NC}"
echo -e "Klassenpfad:     ${GREEN}$ACTUAL_CLASSES_PATH${NC}"
echo ""

# Alte Stub-Dateien löschen
rm -f "$TARGET_DIR/starface-stubs.jar" 2>/dev/null
rm -f "$TARGET_DIR/starface-classes.jar" 2>/dev/null

# ============================================================
# STARFACE 9.x: Module-API ist in /classes, nicht in JARs
# ============================================================

echo -e "${YELLOW}Prüfe auf STARFACE 9.x Struktur (Module-API in classes)...${NC}"

HAS_MODULE_CLASSES=$(ssh "${SSH_USER}@${STARFACE_HOST}" \
    "if [ -d '$CLASSES_PATH/de/vertico/starface/module' ]; then echo 'yes'; fi" 2>/dev/null)

if [ "$HAS_MODULE_CLASSES" == "yes" ]; then
    echo -e "${GREEN}STARFACE 9.x erkannt - Module-API in classes gefunden${NC}"
    echo ""
    echo -e "${YELLOW}Erstelle JAR aus STARFACE classes...${NC}"

    # Temporäres Verzeichnis auf STARFACE erstellen und JAR bauen
    ssh "${SSH_USER}@${STARFACE_HOST}" "cd $CLASSES_PATH && jar cf /tmp/starface-classes.jar de/vertico/starface/module de/vertico/starface/persistence 2>/dev/null || jar cf /tmp/starface-classes.jar de/vertico/starface/module"

    # JAR herunterladen
    scp -q "${SSH_USER}@${STARFACE_HOST}:/tmp/starface-classes.jar" "$TARGET_DIR/"
    ssh "${SSH_USER}@${STARFACE_HOST}" "rm -f /tmp/starface-classes.jar"

    echo -e "  ${GREEN}starface-classes.jar erstellt${NC}"
    echo ""
fi

# ============================================================
# JAR-Dateien herunterladen
# ============================================================

# JARs für STARFACE 9.x (neue Namensgebung)
STARFACE9_JARS=(
    "starface-db-*.jar"
    "starface-commons-*.jar"
    "starface-domain-objects-*.jar"
    "starface-rpc-*.jar"
    "starface-ng-*.jar"
)

# Allgemeine JARs (alle Versionen)
COMMON_JARS=(
    "log4j-api-*.jar"
    "log4j-core-*.jar"
)

# Legacy JARs (STARFACE 8.x und älter)
LEGACY_JARS=(
    "starface-module-*.jar"
    "starface-persistence-*.jar"
)

echo -e "${YELLOW}Lade STARFACE JARs herunter...${NC}"

download_jars() {
    local jar_array=("$@")
    for pattern in "${jar_array[@]}"; do
        files=$(ssh "${SSH_USER}@${STARFACE_HOST}" "ls $ACTUAL_LIB_PATH/$pattern 2>/dev/null" || true)

        if [ -n "$files" ]; then
            for file in $files; do
                filename=$(basename "$file")
                echo -n "  $filename: "
                scp -q "${SSH_USER}@${STARFACE_HOST}:$file" "$TARGET_DIR/" 2>/dev/null
                echo -e "${GREEN}OK${NC}"
            done
        fi
    done
}

# Download alle JAR-Typen
download_jars "${STARFACE9_JARS[@]}"
download_jars "${COMMON_JARS[@]}"
download_jars "${LEGACY_JARS[@]}"

echo ""

# ============================================================
# Zusammenfassung
# ============================================================

JAR_COUNT=$(ls -1 "$TARGET_DIR"/*.jar 2>/dev/null | wc -l)

echo -e "${BLUE}========================================"
echo -e " Download abgeschlossen!"
echo -e "========================================${NC}"
echo ""
echo -e "Heruntergeladene Dateien: ${GREEN}$JAR_COUNT${NC}"
echo -e "Speicherort: ${GREEN}$TARGET_DIR/${NC}"
echo ""

if [ "$JAR_COUNT" -gt 0 ]; then
    echo "Inhalt:"
    ls -lh "$TARGET_DIR"/*.jar 2>/dev/null | while read line; do
        filename=$(echo "$line" | awk '{print $NF}')
        size=$(echo "$line" | awk '{print $5}')
        basename=$(basename "$filename")
        echo -e "  ${GREEN}$basename${NC} ($size)"
    done
    echo ""

    # Prüfen ob Module-API vorhanden ist
    if [ -f "$TARGET_DIR/starface-classes.jar" ] || ls "$TARGET_DIR"/starface-module-*.jar 2>/dev/null | grep -q .; then
        echo -e "${GREEN}Module-API gefunden - du kannst jetzt bauen:${NC}"
        echo "  cd v8-9-10 && ./build-block.sh"
    else
        echo -e "${YELLOW}Warnung: Module-API nicht gefunden${NC}"
        echo "Das Build-Script wird Stub-Klassen erstellen."
    fi
else
    echo -e "${RED}Keine JARs heruntergeladen. Prüfe die Verbindung und Berechtigungen.${NC}"
    exit 1
fi

# ============================================================
# JavaMail-Bibliothek prüfen und ggf. installieren
# ============================================================

echo ""
echo -e "${YELLOW}Prüfe JavaMail-Bibliothek auf STARFACE...${NC}"

HAS_JAVAMAIL=$(ssh "${SSH_USER}@${STARFACE_HOST}" \
    "ls $ACTUAL_LIB_PATH/*mail*.jar 2>/dev/null | head -1" || true)

if [ -n "$HAS_JAVAMAIL" ]; then
    echo -e "${GREEN}JavaMail bereits vorhanden:${NC}"
    ssh "${SSH_USER}@${STARFACE_HOST}" "ls -1 $ACTUAL_LIB_PATH/*mail*.jar 2>/dev/null" | while read jar; do
        echo -e "  ${GREEN}$(basename $jar)${NC}"
    done
else
    echo -e "${YELLOW}JavaMail nicht gefunden - wird installiert...${NC}"

    # JavaMail herunterladen falls nicht lokal vorhanden
    DEPS_DIR="$SCRIPT_DIR/v8-9-10/libs/deps"
    mkdir -p "$DEPS_DIR"

    if [ ! -f "$DEPS_DIR/javax.mail.jar" ]; then
        echo "  Lade javax.mail.jar herunter..."
        curl -sL -o "$DEPS_DIR/javax.mail.jar" \
            "https://repo1.maven.org/maven2/com/sun/mail/javax.mail/1.6.2/javax.mail-1.6.2.jar"
    fi

    if [ ! -f "$DEPS_DIR/activation.jar" ]; then
        echo "  Lade activation.jar herunter..."
        curl -sL -o "$DEPS_DIR/activation.jar" \
            "https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar"
    fi

    # Auf STARFACE kopieren
    echo "  Kopiere nach STARFACE..."
    scp -q "$DEPS_DIR/javax.mail.jar" "${SSH_USER}@${STARFACE_HOST}:$ACTUAL_LIB_PATH/"
    scp -q "$DEPS_DIR/activation.jar" "${SSH_USER}@${STARFACE_HOST}:$ACTUAL_LIB_PATH/"

    echo -e "${GREEN}JavaMail erfolgreich auf STARFACE installiert!${NC}"
    echo ""
    echo -e "${YELLOW}WICHTIG: STARFACE-Dienst neustarten für Aktivierung:${NC}"
    echo "  ssh ${SSH_USER}@${STARFACE_HOST} 'systemctl restart tomcat'"
fi

echo ""
echo -e "${GREEN}Fertig! Du kannst jetzt den Mail2FaxBlock kompilieren:${NC}"
echo "  cd v8-9-10 && ./build-block.sh"
