#!/bin/bash

# SSL-Konfiguration für DOCX Template Server

echo "🔐 SSL-Konfiguration für DOCX Template Server"
echo "============================================="

# Funktion für Self-Signed Zertifikat
generate_self_signed() {
    local domain="${1:-localhost}"
    local days="${2:-365}"
    
    echo "📝 Generiere selbstsigniertes Zertifikat für: $domain"
    
    mkdir -p ssl
    cd ssl
    
    # Erstelle SSL-Konfigurationsdatei mit SAN
    cat > ssl.conf << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
C=DE
ST=Germany
L=City
O=DOCX Template Server
CN=$domain

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
DNS.2 = *.localhost
IP.1 = 127.0.0.1
IP.2 = 192.168.0.12
IP.3 = ::1
EOF
    
    # Generiere private Key
    openssl genrsa -out key.pem 4096
    
    # Generiere Certificate Signing Request mit SAN
    openssl req -new -key key.pem -out csr.pem -config ssl.conf
    
    # Generiere selbstsigniertes Zertifikat mit SAN
    openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem -days $days -extensions v3_req -extfile ssl.conf
    
    # Aufräumen
    rm csr.pem
    
    echo "✅ SSL-Zertifikat mit SAN erstellt:"
    echo "   🔑 Privater Schlüssel: ssl/key.pem"
    echo "   📜 Zertifikat: ssl/cert.pem"
    echo "   📅 Gültig für: $days Tage"
    echo "   🌐 Domain: $domain"
    echo "   🔗 Zusätzliche IPs: 127.0.0.1, 192.168.0.12"
}

# Funktion für Let's Encrypt (Production)
setup_letsencrypt() {
    local domain="$1"
    local email="$2"
    
    if [ -z "$domain" ] || [ -z "$email" ]; then
        echo "❌ Domain und E-Mail erforderlich für Let's Encrypt"
        echo "Verwendung: $0 letsencrypt your-domain.com your-email@domain.com"
        return 1
    fi
    
    echo "🌐 Richte Let's Encrypt für $domain ein..."
    
    # Installiere certbot falls nicht vorhanden
    if ! command -v certbot &> /dev/null; then
        echo "📦 Installiere certbot..."
        apt-get update && apt-get install -y certbot
    fi
    
    # Stoppe Server temporär für Zertifikat-Erstellung
    echo "⏸️ Stoppe Server für Zertifikat-Erstellung..."
    pkill -f "node server.js" 2>/dev/null || true
    
    # Erstelle Let's Encrypt Zertifikat
    certbot certonly --standalone \
        --email "$email" \
        --agree-tos \
        --no-eff-email \
        -d "$domain"
    
    if [ $? -eq 0 ]; then
        # Kopiere Zertifikate in ssl/ Ordner
        mkdir -p ssl
        cp "/etc/letsencrypt/live/$domain/privkey.pem" ssl/key.pem
        cp "/etc/letsencrypt/live/$domain/fullchain.pem" ssl/cert.pem
        
        echo "✅ Let's Encrypt Zertifikat installiert!"
        echo "🔄 Auto-Renewal eingerichtet"
        
        # Richte Auto-Renewal ein
        echo "0 12 * * * /usr/bin/certbot renew --quiet && cp /etc/letsencrypt/live/$domain/privkey.pem /home/nodejs/ssl/key.pem && cp /etc/letsencrypt/live/$domain/fullchain.pem /home/nodejs/ssl/cert.pem && pkill -f 'node server.js' && cd /home/nodejs && node server.js > server.log 2>&1 &" | crontab -
    else
        echo "❌ Let's Encrypt Zertifikat-Erstellung fehlgeschlagen"
        return 1
    fi
}

# Funktion für Zertifikat-Info
cert_info() {
    if [ -f "ssl/cert.pem" ]; then
        echo "📋 SSL-Zertifikat Informationen:"
        echo "================================"
        openssl x509 -in ssl/cert.pem -text -noout | grep -A 5 -B 5 -E "(Subject:|Issuer:|Not Before|Not After|DNS:|IP Address:|CN=)"
        echo ""
        echo "🔍 Zertifikat-Details:"
        openssl x509 -in ssl/cert.pem -noout -dates -subject -issuer
    else
        echo "❌ Kein SSL-Zertifikat gefunden in ssl/cert.pem"
    fi
}

# Hauptmenü
case "$1" in
    "self-signed")
        domain="${2:-localhost}"
        days="${3:-365}"
        generate_self_signed "$domain" "$days"
        ;;
    "letsencrypt")
        setup_letsencrypt "$2" "$3"
        ;;
    "info")
        cert_info
        ;;
    "test")
        echo "🧪 Teste SSL-Konfiguration..."
        if [ -f "ssl/cert.pem" ] && [ -f "ssl/key.pem" ]; then
            echo "✅ SSL-Dateien gefunden"
            openssl x509 -in ssl/cert.pem -noout -checkend 86400 && echo "✅ Zertifikat ist gültig" || echo "⚠️ Zertifikat läuft bald ab"
        else
            echo "❌ SSL-Dateien nicht gefunden"
        fi
        ;;
    "remove")
        echo "🗑️ Entferne SSL-Zertifikate..."
        rm -rf ssl/
        echo "✅ SSL-Zertifikate entfernt"
        ;;
    "help"|"")
        echo "SSL-Konfiguration für DOCX Template Server"
        echo ""
        echo "Verwendung: $0 [KOMMANDO] [OPTIONEN]"
        echo ""
        echo "Kommandos:"
        echo "  self-signed [domain] [tage]  - Erstelle selbstsigniertes Zertifikat"
        echo "  letsencrypt domain email     - Richte Let's Encrypt ein (Production)"
        echo "  info                         - Zeige Zertifikat-Informationen"
        echo "  test                         - Teste SSL-Konfiguration"
        echo "  remove                       - Entferne alle SSL-Zertifikate"
        echo "  help                         - Diese Hilfe anzeigen"
        echo ""
        echo "Beispiele:"
        echo "  $0 self-signed localhost 365"
        echo "  $0 self-signed my-server.local 30"
        echo "  $0 letsencrypt example.com admin@example.com"
        echo "  $0 info"
        echo ""
        echo "Hinweise:"
        echo "  - Selbstsignierte Zertifikate sind nur für Entwicklung/interne Nutzung"
        echo "  - Let's Encrypt ist für öffentliche Domains mit Internet-Zugang"
        echo "  - Zertifikate werden in ssl/ Ordner gespeichert"
        ;;
    *)
        echo "❌ Unbekanntes Kommando: $1"
        echo "Verwende '$0 help' für Hilfe"
        exit 1
        ;;
esac