#!/bin/bash

# Cloudflare API-Konfiguration
# Setze deine API-Schlüssel und Zone-ID als Umgebungsvariablen oder ersetze sie direkt

# CF_ZONE_ID="1b7756cee93ed8ba8c05bdc3cb0a5da8"     # Die Zone-ID deiner Domain bei Cloudflare
AWS_REGION="us-east-2"                    # AWS-Region
if [ -z "$DOMAIN_NAME" ]; then
  echo "Fehler: DOMAIN_NAME ist nicht gesetzt."
  echo "Bitte setzen Sie die Variable mit: export DOMAIN_NAME='IhreDomain.de'"
  exit 1  # Skript mit Fehlercode beenden
fi
# Überprüfen, ob der erforderliche API-Token gesetzt ist
if [ -z "$CF_API_TOKEN" ]; then
    echo "Fehler: Bitte setze CF_API_TOKEN als Umgebungsvariable oder im Skript."
    exit 1
fi

# Zone ID basierend auf Domain-Namen abrufen
echo "Zone ID für $DOMAIN_NAME abrufen..."
ZONE_RESPONSE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$DOMAIN_NAME" \
    -H "Authorization: Bearer $CF_API_TOKEN" \
    -H "Content-Type: application/json")

# Überprüfen, ob die Antwort erfolgreich war
if [ "$(echo $ZONE_RESPONSE | jq -r '.success')" != "true" ]; then
    echo "Fehler beim Abrufen der Zone ID:"
    echo $ZONE_RESPONSE | jq .
    exit 1
fi

# Zone ID extrahieren
CF_ZONE_ID=$(echo $ZONE_RESPONSE | jq -r '.result[0].id')

# Überprüfen, ob eine Zone ID gefunden wurde
if [ -z "$CF_ZONE_ID" ] || [ "$CF_ZONE_ID" = "null" ]; then
    echo "Keine Zone ID für $DOMAIN_NAME gefunden. Bitte stelle sicher, dass die Domain bei Cloudflare registriert ist."
    exit 1
fi

echo "Zone ID für $DOMAIN_NAME: $CF_ZONE_ID"

# Hilfsfunktion für DNS-Einträge anlegen
create_dns_record() {
    local TYPE=$1
    local NAME=$2
    local CONTENT=$3
    local PROXIED=$4
    local TTL=$5
    local PRIORITY=$6  # Neu: MX-Priority

    # Standardwerte für Proxied und TTL setzen, falls nicht angegeben
    if [ -z "$PROXIED" ]; then
        PROXIED="false"
    fi
    
    if [ -z "$TTL" ]; then
        TTL=3600  # 1 Stunde
    fi

    echo "Erstelle $TYPE-Eintrag für $NAME mit Inhalt $CONTENT..."
    
    # Json Payload vorbereiten abhängig vom Record-Typ
    local JSON_DATA=""
    
    if [ "$TYPE" = "MX" ]; then
        # Bei MX-Einträgen müssen wir die Priority separat angeben
        if [ -z "$PRIORITY" ]; then
            PRIORITY=10  # Standard-Priority, falls nicht angegeben
        fi
        
        JSON_DATA="{
            \"type\": \"$TYPE\",
            \"name\": \"$NAME\",
            \"content\": \"$CONTENT\",
            \"ttl\": $TTL,
            \"priority\": $PRIORITY,
            \"proxied\": $PROXIED
        }"
    elif [ "$TYPE" = "TXT" ]; then
        # Bei TXT-Einträgen müssen wir sicherstellen, dass der Inhalt in Anführungszeichen steht
        # Aber Anführungszeichen innerhalb von JSON müssen escaped werden
        # Wir entfernen zuerst alle vorhandenen Anführungszeichen und fügen sie dann korrekt hinzu
        CONTENT=$(echo "$CONTENT" | sed 's/"//g')
        
        JSON_DATA="{
            \"type\": \"$TYPE\",
            \"name\": \"$NAME\",
            \"content\": \"\\\"$CONTENT\\\"\",
            \"ttl\": $TTL,
            \"proxied\": $PROXIED
        }"
    else
        # Für alle anderen Record-Typen (z.B. CNAME)
        JSON_DATA="{
            \"type\": \"$TYPE\",
            \"name\": \"$NAME\",
            \"content\": \"$CONTENT\",
            \"ttl\": $TTL,
            \"proxied\": $PROXIED
        }"
    fi
    
    # API-Aufruf an Cloudflare
    curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records" \
        -H "Authorization: Bearer $CF_API_TOKEN" \
        -H "Content-Type: application/json" \
        --data "$JSON_DATA" | jq .
}

# DKIM-Einträge abrufen und bei Cloudflare eintragen
echo "DKIM-Tokens abrufen von AWS SES..."
DKIM_TOKENS=$(aws ses get-identity-dkim-attributes \
    --identities ${DOMAIN_NAME} \
    --region ${AWS_REGION} \
    --query "DkimAttributes.\"${DOMAIN_NAME}\".DkimTokens" \
    --output text)

# Überprüfen, ob DKIM-Tokens abgerufen wurden
if [ -z "$DKIM_TOKENS" ]; then
    echo "Fehler: Konnte DKIM-Tokens nicht abrufen. Ist die Domain bei AWS SES verifiziert?"
    exit 1
fi

# Domain-Verifizierungstoken abrufen
VERIFICATION_TOKEN=$(aws ses get-identity-verification-attributes \
    --identities ${DOMAIN_NAME} \
    --region ${AWS_REGION} \
    --query "VerificationAttributes.\"${DOMAIN_NAME}\".VerificationToken" \
    --output text)

# DKIM-Einträge anlegen
echo "DKIM-Einträge anlegen bei Cloudflare..."
for TOKEN in ${DKIM_TOKENS}; do
    create_dns_record "CNAME" "${TOKEN}._domainkey.${DOMAIN_NAME}" "${TOKEN}.dkim.amazonses.com" "false" 3600
done

# Domain-Verifizierungs-TXT-Eintrag anlegen
echo "Domain-Verifizierungs-TXT-Eintrag anlegen bei Cloudflare..."
create_dns_record "TXT" "_amazonses.${DOMAIN_NAME}" "${VERIFICATION_TOKEN}" "false" 3600

# MX-Einträge anlegen
echo "MX-Einträge anlegen bei Cloudflare..."
create_dns_record "MX" "${DOMAIN_NAME}" "inbound-smtp.${AWS_REGION}.amazonaws.com" "false" 3600 10
create_dns_record "MX" "mail.${DOMAIN_NAME}" "feedback-smtp.${AWS_REGION}.amazonses.com" "false" 3600 10

# CNAME für mail.{Domain} anlegen
echo "CNAME für mail.${DOMAIN_NAME} anlegen bei Cloudflare..."
create_dns_record "CNAME" "imap.${DOMAIN_NAME}" "${DOMAIN_NAME}" "false" 1

# SPF-Eintrag anlegen
echo "SPF-Eintrag anlegen bei Cloudflare..."
create_dns_record "TXT" "mail.${DOMAIN_NAME}" "v=spf1 include:amazonses.com ~all" "false" 3600

# DMARC-Eintrag anlegen
echo "DMARC-Eintrag anlegen bei Cloudflare..."
create_dns_record "TXT" "_dmarc.${DOMAIN_NAME}" "v=DMARC1; p=quarantine; pct=100; rua=mailto:postmaster@${DOMAIN_NAME}" "false" 3600

echo "DNS-Einrichtung abgeschlossen."
echo "Es kann bis zu 72 Stunden dauern, bis AWS SES die Domain verifiziert hat."