"""Async E-Mail-Versand via SMTP."""
import asyncio
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

import aiosmtplib

from config import (
    SMTP_HOST,
    SMTP_PORT,
    SMTP_USER,
    SMTP_PASSWORD,
    SMTP_FROM_EMAIL,
    SMTP_FROM_NAME,
    SMTP_USE_TLS,
)

logger = logging.getLogger("osint.email")

# Die IONOS-SMTP-Farm (smtp.ionos.de) besteht aus ~10 Backends im DNS-Round-Robin;
# einzelne Backends koennen tot/ueberlastet sein (beobachtet 2026-07-10). Jeder
# Versuch oeffnet eine neue Verbindung und wuerfelt damit ein neues Backend.
MAIL_VERSUCHE = 3
MAIL_TIMEOUT_S = 20


async def send_email(to_email: str, subject: str, html_body: str) -> bool:
    """Sendet eine HTML-E-Mail.

    Returns:
        True bei Erfolg, False bei Fehler.
    """
    if not SMTP_HOST:
        logger.warning(f"SMTP nicht konfiguriert - E-Mail an {to_email} nicht gesendet: {subject}")
        return False

    msg = MIMEMultipart("alternative")
    msg["From"] = f"{SMTP_FROM_NAME} <{SMTP_FROM_EMAIL}>"
    msg["To"] = to_email
    msg["Subject"] = subject

    # Text-Fallback (simpel)
    text_content = f"Betreff: {subject}\n\nBitte oeffnen Sie diese E-Mail in einem HTML-faehigen E-Mail-Client."
    msg.attach(MIMEText(text_content, "plain", "utf-8"))
    msg.attach(MIMEText(html_body, "html", "utf-8"))

    letzter_fehler = None
    for versuch in range(1, MAIL_VERSUCHE + 1):
        try:
            await aiosmtplib.send(
                msg,
                hostname=SMTP_HOST,
                port=SMTP_PORT,
                username=SMTP_USER if SMTP_USER else None,
                password=SMTP_PASSWORD if SMTP_PASSWORD else None,
                start_tls=SMTP_USE_TLS,
                timeout=MAIL_TIMEOUT_S,
            )
            logger.info(f"E-Mail gesendet an {to_email}: {subject}")
            return True
        except Exception as e:
            letzter_fehler = e
            logger.warning(
                f"E-Mail-Versand Versuch {versuch}/{MAIL_VERSUCHE} an {to_email} fehlgeschlagen: {e}"
            )
            if versuch < MAIL_VERSUCHE:
                await asyncio.sleep(1.5)

    logger.error(
        f"E-Mail-Versand endgueltig fehlgeschlagen an {to_email} "
        f"nach {MAIL_VERSUCHE} Versuchen: {letzter_fehler}"
    )
    return False
