import re
import unicodedata


def slugify(value: str) -> str:
    value = unicodedata.normalize("NFKD", value).encode("ascii", "ignore").decode("ascii")
    value = re.sub(r"[^\w\s-]", "", value.lower())
    return re.sub(r"[-\s]+", "-", value).strip("-") or "review"


def unique_review_slug(title: str, owner_id: int) -> str:
    from reviews.models import Review

    base = slugify(title)[:80]
    slug = base
    counter = 1
    while Review.objects.filter(owner_id=owner_id, slug=slug).first():
        slug = f"{base}-{counter}"
        counter += 1
    return slug


def unique_username(name: str, email: str) -> str:
    
    base = slugify(name.split()[0] if name else email.split("@")[0])[:40]
    username = base or "user"
    counter = 1
    while User.objects.filter(username=username).first():
        username = f"{base}{counter}"
        counter += 1
    return username
