from typing import Optional, List
from django.db.models import F, QuerySet
from django.core.cache import cache
from .models import Article, Category, Comment
from django.contrib.auth import get_user_model


User = get_user_model()


def get_published_articles(category_slug: Optional[str] = None) -> QuerySet[Article]:
    """
    Возвращает опубликованные статьи с возможностью фильтрации по категории.
    Результат кэшируется на 5 минут.
    """
    cache_key = f"articles_list_{category_slug or 'all'}"
    articles = cache.get(cache_key)
    if articles is None:
        qs = Article.objects.filter(is_published=True).select_related('category')
        if category_slug:
            qs = qs.filter(category__slug=category_slug)
        articles = list(qs.order_by('-time_create'))
        cache.set(cache_key, articles, 300)  # 5 минут
    return articles

def get_article_by_slug(slug: str) -> Optional[Article]:
    """Получение статьи по slug с учётом публикации."""
    try:
        return Article.objects.get(slug=slug, is_published=True)
    except Article.DoesNotExist:
        return None

def increment_article_views(article: Article) -> None:
    """Увеличивает счётчик просмотров статьи."""
    Article.objects.filter(pk=article.pk).update(views_count=F('views_count') + 1)

def add_comment_to_article(article: Article, data: dict, user: User = None, parent: Comment = None) -> Comment:
    """Создание комментария к статье (без модерации)."""
    comment = Comment.objects.create(
        article=article,
        author_name=data['author_name'],
        author_email=data['author_email'],
        content=data['content'],
        user=user,
        parent=parent,
        is_moderated=False
    )
    # Здесь можно отправить уведомление администратору
    return comment

