"""BAN YARO — Content-Filter für Spam und Missbrauch im Forum."""

import re
from datetime import datetime, timedelta, timezone
from fastapi import HTTPException

# Offensichtliche Spam-Signale
_SPAM_KEYWORDS = [
    "casino", "poker", "slots", "jackpot", "sportwetten",
    "viagra", "cialis", "levitra", "pharmacy", "apotheke online",
    "kreditkarte sofort", "kredit ohne schufa", "schnell geld verdienen",
    "passive income", "work from home", "earn money fast",
    "click here", "klick hier", "free followers", "buy followers",
    "whatsapp +", "telegram +", "call now", "jetzt anrufen",
    "seo service", "backlinks kaufen", "website traffic",
    "crypto invest", "bitcoin verdienen", "nft mint",
    "lose weight fast", "abnehmen schnell", "diät pille",
]

# URL-Muster (http/https oder nackte Domains)
_URL_RE = re.compile(
    r"(https?://|www\.|\b[a-zA-Z0-9-]+\.(de|com|net|org|io|app|shop|info|biz|ru|cn)\b)",
    re.IGNORECASE,
)

# Mindest-Account-Alter für URL-Posts (Tage)
_MIN_DAYS_FOR_URLS = 7


def check_forum_content(text: str, user_created_at: str | None = None) -> None:
    """
    Prüft Forum-Text auf Spam.
    Wirft HTTPException(400) bei Fund.
    """
    lower = text.lower()

    # Spam-Keywords
    for kw in _SPAM_KEYWORDS:
        if kw in lower:
            raise HTTPException(400, "Dein Beitrag wurde als Spam erkannt und nicht gespeichert.")

    # URLs in neuen Accounts sperren
    if _URL_RE.search(text):
        if user_created_at:
            try:
                created = datetime.fromisoformat(user_created_at)
                if created.tzinfo is None:
                    created = created.replace(tzinfo=timezone.utc)
                age = datetime.now(timezone.utc) - created
                if age < timedelta(days=_MIN_DAYS_FOR_URLS):
                    raise HTTPException(
                        400,
                        "Links können erst nach 7 Tagen Mitgliedschaft gepostet werden."
                    )
            except (ValueError, TypeError):
                pass

    # Zu viele Sonderzeichen / Zeichensalat
    if len(text) > 20:
        alnum = sum(c.isalnum() or c.isspace() for c in text)
        ratio = alnum / len(text)
        if ratio < 0.5:
            raise HTTPException(400, "Dein Beitrag enthält zu viele Sonderzeichen.")
