from django.shortcuts import get_object_or_404, redirect, render
from django.db.models import Count, F
from django.core.paginator import Paginator
from blogs.models import Blog, Category, Comment
from business.models import Business


def get_blog_brand_business():
    return (
        Business.objects.filter(is_default=True)
        .only("name", "company_name", "profile_photo", "slug")
        .first()
        or Business.objects.filter(company_name__icontains="Verified Enquiries")
        .only("name", "company_name", "profile_photo", "slug")
        .first()
    )


def blog_list(request):
    blog_queryset = Blog.objects.select_related("category", "author").prefetch_related("tags")
    paginator = Paginator(blog_queryset, 6)
    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)

    return render(request, "blogs/list.html", {"page_obj": page_obj})


def blog_detail(request, slug):
    blog = get_object_or_404(
        Blog.objects.select_related("category", "author").prefetch_related("tags"),
        slug=slug,
    )

    if request.method == "POST":
        full_name = (request.POST.get("full_name") or "").strip()
        email = (request.POST.get("email") or "").strip()
        description = (request.POST.get("description") or "").strip()

        if full_name and email and description:
            Comment.objects.create(
                blog=blog,
                name=full_name,
                email=email,
                content=description,
            )
            return redirect(blog.get_absolute_url())

    comments = blog.comments.all().order_by("-created_at")
    all_categories = Category.objects.annotate(blog_count=Count("blogs")).order_by("name")
    Blog.objects.filter(pk=blog.pk).update(views_count=F("views_count") + 1)
    blog.refresh_from_db(fields=["views_count"])
    business = get_blog_brand_business()

    return render(
        request,
        "blogs/detail.html",
        {
            "blog": blog,
            "comments": comments,
            "comment_count": comments.count(),
            "all_categories": all_categories,
            "business": business,
        },
    )
