from django.db.models import Q
from django.shortcuts import get_object_or_404, render

from home.pagination import paginate

from .forms import BlogFilterForm
from .models import BlogPost


def blog_list(request):
    posts = BlogPost.objects.filter(is_published=True)
    form = BlogFilterForm(request.GET or None)
    featured = posts.filter(is_featured=True).first()
    if not featured:
        featured = posts.first()

    if form.is_valid():
        q = form.cleaned_data.get('q')
        category = form.cleaned_data.get('category')
        if q:
            posts = posts.filter(
                Q(title__icontains=q) | Q(excerpt__icontains=q) | Q(content__icontains=q)
            )
        if category:
            posts = posts.filter(category__iexact=category)

    list_posts = posts.exclude(pk=featured.pk if featured else None)
    page_obj, query_string, page_range = paginate(request, list_posts, per_page=9)

    categories = (
        BlogPost.objects.filter(is_published=True)
        .values_list('category', flat=True)
        .distinct()
        .order_by('category')
    )

    return render(request, 'blog/list.html', {
        'featured_post': featured,
        'posts': page_obj,
        'page_obj': page_obj,
        'query_string': query_string,
        'page_range': page_range,
        'form': form,
        'categories': categories,
        'total_count': page_obj.paginator.count,
    })


def blog_detail(request, slug):
    post = get_object_or_404(BlogPost, slug=slug, is_published=True)
    post.views_count += 1
    post.save(update_fields=['views_count'])
    related = BlogPost.objects.filter(is_published=True, category=post.category).exclude(pk=post.pk)[:3]
    return render(request, 'blog/detail.html', {'post': post, 'related_posts': related})
