"""Revisão de demonstração vs revisão pessoal do usuário."""

from __future__ import annotations

from accounts.models import User
from reviews.models import Review
from rsl.services.demo_seed import DEMO_USER_EMAIL, DEMO_USER_EMAIL_LEGACY
from rsl.services.slug import slugify, unique_review_slug

DEMO_OWNER_EMAILS = {DEMO_USER_EMAIL.lower(), DEMO_USER_EMAIL_LEGACY.lower()}


def is_demo_owner(user: User | None) -> bool:
    if user is None:
        return False
    email = (user.email or "").lower()
    return email in DEMO_OWNER_EMAILS or user.username == "demo"


def is_demo_review(review: Review) -> bool:
    if getattr(review, "is_demo", False):
        return True
    return review.slug == "revisao-demonstracao" and is_demo_owner(review.owner)


def can_claim_as_personal(review: Review, user: User) -> bool:
    return (
        user.is_authenticated
        and review.is_author(user)
        and not review.is_main_author(user)
        and is_demo_owner(review.owner)
    )


def _normalize_slug(raw: str, title: str, owner_id: int) -> str:
    base = slugify(raw or title)[:80] or "minha-revisao"
    slug = base
    counter = 1
    while Review.objects.filter(owner_id=owner_id, slug=slug).first():
        slug = f"{base}-{counter}"
        counter += 1
    return slug


def claim_review_as_personal(
    review: Review,
    new_owner: User,
    *,
    slug: str | None = None,
) -> Review:
    """Transfere autoria da conta demo para o colaborador, preservando todos os dados."""
    if not can_claim_as_personal(review, new_owner):
        raise ValueError("Esta revisão não pode ser assumida como pessoal.")

    if new_owner in review.co_authors:
        review.co_authors.remove(new_owner)

    review.owner_id = new_owner.id
    review.is_demo = False
    review.is_public = False
    review.slug = _normalize_slug(slug or "", review.title, new_owner.id)

    
    return review
