#!/bin/bash

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
AWS_REGION="us-east-2"
EMAIL_PREFIX="emails/"
S3_BUCKET_NAME=$(echo "$DOMAIN_NAME" | tr '.' '-' | awk '{print $0 "-emails"}')
# Ersetzen Sie alle Punkte durch Bindestriche und erstellen Sie den RULE_NAME
RULE_NAME="store-$(echo "$DOMAIN_NAME" | tr '.' '-')-to-s3"

# ------------------------
# S3 Bucket erstellen
# ------------------------
echo "S3 Bucket erstellen..."
aws s3api create-bucket \
  --bucket ${S3_BUCKET_NAME} \
  --region ${AWS_REGION} \
  --create-bucket-configuration LocationConstraint=${AWS_REGION}

# Öffentlichen Zugriff blockieren
aws s3api put-public-access-block \
  --bucket ${S3_BUCKET_NAME} \
  --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

# Lebenszyklus-Konfiguration hinzufügen
aws s3api put-bucket-lifecycle-configuration \
  --bucket ${S3_BUCKET_NAME} \
  --lifecycle-configuration '{
    "Rules": [
      {
        "ID": "DeleteOldEmails",
        "Status": "Enabled",
        "Expiration": {
          "Days": 90
        },
        "Filter": {
          "Prefix": ""
        }
      }
    ]
  }'
  
echo "S3 Bucket Policy hinzufügen..."
aws s3api put-bucket-policy \
  --bucket ${S3_BUCKET_NAME} \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "ses.amazonaws.com"
        },
        "Action": [
          "s3:PutObject",
          "s3:GetBucketLocation",
          "s3:ListBucket"
        ],
        "Resource": [
          "arn:aws:s3:::'${S3_BUCKET_NAME}'",
          "arn:aws:s3:::'${S3_BUCKET_NAME}'/*"
        ]
      }
    ]
  }'

# ------------------------  
# SES Domain-Identität erstellen
# ------------------------
echo "SES Domain-Identität erstellen..."
aws sesv2 create-email-identity \
  --email-identity ${DOMAIN_NAME} \
  --region ${AWS_REGION}

# DKIM-Signierung aktivieren
aws sesv2 put-email-identity-dkim-attributes \
  --email-identity ${DOMAIN_NAME} \
  --signing-enabled \
  --region ${AWS_REGION}

# Mail-From-Domain konfigurieren
aws sesv2 put-email-identity-mail-from-attributes \
  --email-identity ${DOMAIN_NAME} \
  --mail-from-domain "mail.${DOMAIN_NAME}" \
  --behavior-on-mx-failure USE_DEFAULT_VALUE \
  --region ${AWS_REGION}

# 3. Receipt Rule Set erstellen
echo "Receipt Rule for bizmatch ruleset erstellen..."
    
aws ses create-receipt-rule --rule-set-name "bizmatch-ruleset" --rule '{
  "Name": "'"${RULE_NAME}"'",
  "Enabled": true,
  "ScanEnabled": true,
  "Actions": [{
    "S3Action": {
      "BucketName": "'"${S3_BUCKET_NAME}"'",
      "ObjectKeyPrefix": "emails/"
    }
  }],
  "TlsPolicy": "Require"
}'


# --------------------------
# IAM-User erstellen
# -------------------------
USER_NAME="${DOMAIN_NAME//./-}-ses-user"  # Ersetzt Punkte durch Bindestriche für validen IAM-Username

NODE_SCRIPT_PATH="./generate_ses_smtp_password.js" 
# Prüfen, ob das Node.js-Script existiert
if [ ! -f "$NODE_SCRIPT_PATH" ]; then
    echo "Fehler: Das Node.js-Script '$NODE_SCRIPT_PATH' wurde nicht gefunden."
    echo "Bitte stelle sicher, dass das Script im angegebenen Pfad existiert."
    exit 1
fi

echo "Erstelle IAM-User: $USER_NAME"
aws iam create-user --user-name $USER_NAME

# 2. Policy-Dokument für SES-Vollzugriff erstellen
POLICY_NAME="${USER_NAME}-SendRawEmailPolicy"
POLICY_DOCUMENT='{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ses:SendRawEmail",
            "Resource": "*"
        }
    ]
}'
echo "Erstelle benutzerdefinierte Policy für SES SendRawEmail"
POLICY_ARN=$(aws iam create-policy \
  --policy-name $POLICY_NAME \
  --policy-document "$POLICY_DOCUMENT" \
  --query 'Policy.Arn' \
  --output text)

echo "Hänge Policy an: $POLICY_ARN"
aws iam attach-user-policy \
  --user-name $USER_NAME \
  --policy-arn $POLICY_ARN

# 4. Access Key und Secret Key für den User erstellen
echo "Erstelle Access Key für den User: $USER_NAME"
KEY_OUTPUT=$(aws iam create-access-key --user-name $USER_NAME)

# 5. Keys ausgeben (am besten in eine sichere Datei speichern)
echo "Zugriffsschlüssel wurden erstellt. Bitte sicher aufbewahren:"
echo "$KEY_OUTPUT" | jq .

# Optional: Keys in separaten Variablen speichern für weitere Verwendung
ACCESS_KEY=$(echo "$KEY_OUTPUT" | jq -r .AccessKey.AccessKeyId)
SECRET_KEY=$(echo "$KEY_OUTPUT" | jq -r .AccessKey.SecretAccessKey)

echo "ACCESS_KEY: $ACCESS_KEY"
echo "SECRET_KEY: $SECRET_KEY"

echo "WICHTIG: Speichere den Secret Key jetzt, da er später nicht mehr abgerufen werden kann!"
# --------------------------
# SMTP Passwort generieren
# --------------------------
echo -e "\nGeneriere SMTP-Passwort für Region $AWS_REGION..."

# Führe das Node.js-Script aus, um das SMTP-Passwort zu generieren
SMTP_PASSWORD=$(node "$NODE_SCRIPT_PATH" "$SECRET_KEY" "$AWS_REGION")

# Prüfen, ob die Ausführung erfolgreich war
if [ $? -ne 0 ]; then
    echo "Fehler bei der Generierung des SMTP-Passworts. Bitte überprüfe das Node.js-Script."
    exit 1
fi

# SMTP-Benutzername ist der Access Key
SMTP_USERNAME="$ACCESS_KEY"

# Ausgabe der SMTP-Anmeldeinformationen
echo -e "\nSMTP-Anmeldeinformationen für Amazon SES in Region $AWS_REGION:"
echo "--------------------------------------------------------------"
echo "SMTP-Server: email-smtp.$AWS_REGION.amazonaws.com"
echo "SMTP-Port: 587 (TLS) oder 465 (SSL)"
echo "SMTP-Benutzername: $SMTP_USERNAME"
echo "SMTP-Passwort: $SMTP_PASSWORD"

# Speichere die Anmeldeinformationen in einer Datei
echo -e "\nSpeichere SMTP-Anmeldeinformationen in ses_smtp_credentials.txt"
cat > "ses_smtp_credentials.txt" << EOF
SMTP-Server: email-smtp.$AWS_REGION.amazonaws.com
SMTP-Port: 587 (TLS) oder 465 (SSL)
SMTP-Benutzername: $SMTP_USERNAME
SMTP-Passwort: $SMTP_PASSWORD
EOF

# Hinweise für die weitere Konfiguration
echo -e "\nHinweise:"
echo "1. Stellen Sie sicher, dass Ihre Domains in Amazon SES verifiziert sind."
echo "2. Bei Bedarf beantragen Sie die Aufhebung der SES-Sandbox-Einschränkungen."
echo "3. Für SMTP-Anwendungen verwenden Sie die SMTP-Anmeldeinformationen (nicht die IAM-Zugangsdaten)."

# Format für .env-Datei
echo -e "\nFür .env-Datei:"
echo "AWS_SES_SMTP_USERNAME=$SMTP_USERNAME"
echo "AWS_SES_SMTP_PASSWORD=$SMTP_PASSWORD"
echo "AWS_SES_SMTP_HOST=email-smtp.$AWS_REGION.amazonaws.com"
echo "AWS_SES_SMTP_PORT=587"