#!/bin/bash

# SSL/TLS Setup Script für YourPart Daemon mit DNS-01 Challenge
# Für Domains mit DNS-Provider wie Cloudflare, Route53, etc.

set -e

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

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

CERT_DIR="/etc/yourpart"
CERT_FILE="$CERT_DIR/server.crt"
KEY_FILE="$CERT_DIR/server.key"
LETSENCRYPT_CERT="/etc/letsencrypt/live/your-part.de/fullchain.pem"
LETSENCRYPT_KEY="/etc/letsencrypt/live/your-part.de/privkey.pem"

log_info "SSL/TLS Setup mit DNS-01 Challenge für YourPart Daemon"

# Prüfe ob certbot installiert ist
if ! command -v certbot &> /dev/null; then
    log_error "Certbot ist nicht installiert!"
    log_info "Installiere Certbot..."
    if command -v apt &> /dev/null; then
        sudo apt update
        sudo apt install -y certbot
    elif command -v zypper &> /dev/null; then
        sudo zypper install -y certbot
    else
        log_error "Paketmanager nicht unterstützt. Installiere Certbot manuell."
        exit 1
    fi
fi

# DNS Provider Auswahl
echo ""
log_info "Wählen Sie Ihren DNS-Provider:"
echo "1) Cloudflare"
echo "2) Route53 (AWS)"
echo "3) Manual (manuelle DNS-Einträge)"
echo ""
read -p "Ihre Wahl (1-3): " -n 1 -r
echo ""

case $REPLY in
    1)
        DNS_PROVIDER="cloudflare"
        ;;
    2)
        DNS_PROVIDER="route53"
        ;;
    3)
        DNS_PROVIDER="manual"
        ;;
    *)
        log_error "Ungültige Auswahl!"
        exit 1
        ;;
esac

# Erstelle Zertifikats-Verzeichnis
if [ ! -d "$CERT_DIR" ]; then
    log_info "Erstelle Zertifikats-Verzeichnis: $CERT_DIR"
    sudo mkdir -p "$CERT_DIR"
fi

# DNS-Provider spezifische Konfiguration
case $DNS_PROVIDER in
    "cloudflare")
        log_info "Cloudflare DNS-01 Challenge Setup"
        
        # Prüfe ob Cloudflare Plugin installiert ist
        if ! certbot plugins | grep -q cloudflare; then
            log_info "Installiere Cloudflare Plugin..."
            if command -v apt &> /dev/null; then
                sudo apt install -y python3-certbot-dns-cloudflare
            elif command -v zypper &> /dev/null; then
                sudo zypper install -y python3-certbot-dns-cloudflare
            else
                log_error "Cloudflare Plugin nicht verfügbar. Installiere manuell."
                exit 1
            fi
        fi
        
        # Erstelle Cloudflare Credentials Datei
        log_info "Erstelle Cloudflare Credentials..."
        read -p "Cloudflare API Token: " -s CF_TOKEN
        echo
        
        CF_CREDENTIALS_FILE="/etc/yourpart/cloudflare.ini"
        sudo tee "$CF_CREDENTIALS_FILE" > /dev/null << EOF
dns_cloudflare_api_token = $CF_TOKEN
EOF
        sudo chmod 600 "$CF_CREDENTIALS_FILE"
        
        # Erstelle Zertifikat
        log_info "Erstelle Let's Encrypt Zertifikat mit Cloudflare DNS-01 Challenge..."
        sudo certbot certonly \
            --dns-cloudflare \
            --dns-cloudflare-credentials "$CF_CREDENTIALS_FILE" \
            -d your-part.de \
            --non-interactive \
            --agree-tos \
            --email admin@your-part.de
        ;;
        
    "route53")
        log_info "Route53 DNS-01 Challenge Setup"
        
        # Prüfe ob Route53 Plugin installiert ist
        if ! certbot plugins | grep -q route53; then
            log_info "Installiere Route53 Plugin..."
            if command -v apt &> /dev/null; then
                sudo apt install -y python3-certbot-dns-route53
            elif command -v zypper &> /dev/null; then
                sudo zypper install -y python3-certbot-dns-route53
            else
                log_error "Route53 Plugin nicht verfügbar. Installiere manuell."
                exit 1
            fi
        fi
        
        # Erstelle Zertifikat
        log_info "Erstelle Let's Encrypt Zertifikat mit Route53 DNS-01 Challenge..."
        log_warning "Stelle sicher, dass AWS-Credentials konfiguriert sind!"
        sudo certbot certonly \
            --dns-route53 \
            -d your-part.de \
            --non-interactive \
            --agree-tos \
            --email admin@your-part.de
        ;;
        
    "manual")
        log_info "Manuelle DNS-01 Challenge"
        log_warning "Sie müssen die DNS-TXT-Einträge manuell erstellen!"
        
        # Erstelle Zertifikat mit manueller Bestätigung
        sudo certbot certonly \
            --manual \
            --preferred-challenges dns \
            -d your-part.de \
            --agree-tos \
            --email admin@your-part.de
        ;;
esac

if [ $? -eq 0 ]; then
    log_success "Let's Encrypt Zertifikat erfolgreich erstellt!"
    
    # Erstelle Symlinks zu den Zertifikaten
    sudo ln -sf "$LETSENCRYPT_CERT" "$CERT_FILE"
    sudo ln -sf "$LETSENCRYPT_KEY" "$KEY_FILE"
    
    # Setze korrekte Berechtigungen
    sudo chown yourpart:yourpart "$CERT_FILE" "$KEY_FILE"
    sudo chmod 644 "$CERT_FILE"
    sudo chmod 600 "$KEY_FILE"
    
    # Zeige Zertifikats-Informationen
    log_info "Let's Encrypt Zertifikats-Informationen:"
    openssl x509 -in "$CERT_FILE" -text -noout | grep -E "(Subject:|Not Before|Not After|DNS:)"
    
    # Erstelle Auto-Renewal Script
    log_info "Richte automatische Zertifikats-Erneuerung ein..."
    
    RENEWAL_SCRIPT="/etc/yourpart/renew-ssl-dns.sh"
    sudo tee "$RENEWAL_SCRIPT" > /dev/null << EOF
#!/bin/bash
# Automatische SSL-Zertifikats-Erneuerung für YourPart Daemon (DNS-01)

CERT_DIR="/etc/yourpart"
LETSENCRYPT_CERT="/etc/letsencrypt/live/your-part.de/fullchain.pem"
LETSENCRYPT_KEY="/etc/letsencrypt/live/your-part.de/privkey.pem"

# Erneuere Zertifikat
certbot renew --quiet

if [ \$? -eq 0 ]; then
    # Aktualisiere Symlinks
    ln -sf "\$LETSENCRYPT_CERT" "\$CERT_DIR/server.crt"
    ln -sf "\$LETSENCRYPT_KEY" "\$CERT_DIR/server.key"
    
    # Setze Berechtigungen
    chown yourpart:yourpart "\$CERT_DIR/server.crt" "\$CERT_DIR/server.key"
    chmod 644 "\$CERT_DIR/server.crt"
    chmod 600 "\$CERT_DIR/server.key"
    
    # Starte Daemon neu
    systemctl reload yourpart-daemon
    
    echo "\$(date): SSL-Zertifikat erfolgreich erneuert" >> /var/log/yourpart/ssl-renewal.log
fi
EOF
    
    sudo chmod +x "$RENEWAL_SCRIPT"
    
    # Füge Cron Job hinzu (täglich um 2:30 Uhr)
    (sudo crontab -l 2>/dev/null; echo "30 2 * * * $RENEWAL_SCRIPT") | sudo crontab -
    
    log_success "Automatische Erneuerung eingerichtet (täglich um 2:30 Uhr)"
    
    log_info ""
    log_info "Nächste Schritte:"
    log_info "1. Aktiviere SSL in der Konfiguration:"
    log_info "   WEBSOCKET_SSL_ENABLED=true"
    log_info "2. Starte den Daemon neu:"
    log_info "   sudo systemctl restart yourpart-daemon"
    log_info "3. Verbinde dich mit:"
    log_info "   wss://your-part.de:4551"
    log_info ""
    log_success "Let's Encrypt Zertifikat ist produktionsbereit!"
    
else
    log_error "Let's Encrypt Zertifikat konnte nicht erstellt werden!"
    exit 1
fi
