from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from django.db.models import Q, Count
from django.utils import timezone
from .models import Article, Category, Tag

# Create your views here.
def article_list(request):
    """Display list of published articles with pagination."""
    articles = Article.objects.filter(
        status='published',
        published_date__lte=timezone.now()
    ).select_related('author', 'category').prefetch_related('tags')
    
    # Get featured articles
    featured_articles = articles.filter(is_featured=True)[:3]
    
    # Get categories with article count
    categories = Category.objects.all().annotate(
        article_count=Count('articles')
    )
    
    # Get popular tags
    tags = Tag.objects.all().annotate(
        article_count=Count('articles')
    ).order_by('-article_count')[:10]
    
    # Pagination
    paginator = Paginator(articles, 6)  
    page = request.GET.get('page')
    articles = paginator.get_page(page)
    
    context = {
        'articles': articles,
        'featured_articles': featured_articles,
        'categories': categories,
        'tags': tags,
    }
    return render(request, 'news/article_list.html', context)

def article_detail(request, slug):
    """Display a single article."""
    article = get_object_or_404(
        Article.objects.select_related('author', 'category').prefetch_related('tags'),
        slug=slug,
        status='published',
        published_date__lte=timezone.now()
    )
    
    # Increment view count
    article.views_count += 1
    article.save()
    
    # Get related articles
    related_articles = Article.objects.filter(
        Q(category=article.category) | Q(tags__in=article.tags.all())
    ).exclude(id=article.id).distinct()[:3]
    
    context = {
        'article': article,
        'related_articles': related_articles,
    }
    return render(request, 'news/article_detail.html', context)

def category_articles(request, slug):
    """Display articles in a specific category."""
    category = get_object_or_404(Category, slug=slug)
    articles = Article.objects.filter(
        category=category,
        status='published',
        published_date__lte=timezone.now()
    ).select_related('author')
    
    # Pagination
    paginator = Paginator(articles, 9)
    page = request.GET.get('page')
    articles = paginator.get_page(page)
    
    context = {
        'category': category,
        'articles': articles,
    }
    return render(request, 'news/category_articles.html', context)

def tag_articles(request, slug):
    """Display articles with a specific tag."""
    tag = get_object_or_404(Tag, slug=slug)
    articles = Article.objects.filter(
        tags=tag,
        status='published',
        published_date__lte=timezone.now()
    ).select_related('author')
    
    # Pagination
    paginator = Paginator(articles, 9)
    page = request.GET.get('page')
    articles = paginator.get_page(page)
    
    context = {
        'tag': tag,
        'articles': articles,
    }
    return render(request, 'news/tag_articles.html', context)

def search_articles(request):
    """Search articles by title, content, or tags."""
    query = request.GET.get('q', '')
    articles = []
    
    if query:
        articles = Article.objects.filter(
            Q(title__icontains=query) |
            Q(content__icontains=query) |
            Q(tags__name__icontains=query),
            status='published',
            published_date__lte=timezone.now()
        ).select_related('author', 'category').distinct()
        
        # Pagination
        paginator = Paginator(articles, 9)
        page = request.GET.get('page')
        articles = paginator.get_page(page)
    
    context = {
        'query': query,
        'articles': articles,
    }
    return render(request, 'news/search_results.html', context)