from django.views.generic import ListView, DetailView
from django.shortcuts import get_object_or_404
from django.http import JsonResponse
from .models import Post, Category


class PostListView(ListView):
    """Danh sách tất cả bài viết"""
    model = Post
    template_name = 'blog/post_list.html'
    context_object_name = 'posts'
    paginate_by = 10
    
    def get_queryset(self):
        queryset = Post.objects.filter(is_published=True).select_related('category')
        
        # Filter by category if provided
        category_slug = self.kwargs.get('category_slug')
        if category_slug:
            queryset = queryset.filter(category__slug=category_slug)
        
        return queryset
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = Category.objects.all()
        
        category_slug = self.kwargs.get('category_slug')
        if category_slug:
            context['current_category'] = get_object_or_404(Category, slug=category_slug)
        
        return context


class PostDetailView(DetailView):
    """Chi tiết bài viết"""
    model = Post
    template_name = 'blog/post_detail.html'
    context_object_name = 'post'
    
    def get_queryset(self):
        return Post.objects.filter(is_published=True).select_related('category')
    
    def get_object(self, queryset=None):
        obj = super().get_object(queryset)
        # Increment view count
        obj.views += 1
        obj.save(update_fields=['views'])
        return obj
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Related posts
        context['related_posts'] = Post.objects.filter(
            category=self.object.category,
            is_published=True
        ).exclude(pk=self.object.pk)[:5]
        context['categories'] = Category.objects.all()
        return context


def api_latest_posts(request):
    """API endpoint to get latest 10 blog posts"""
    posts = Post.objects.filter(is_published=True).select_related('category')[:10]
    
    data = {
        'success': True,
        'count': len(posts),
        'posts': [
            {
                'id': post.pk,
                'title': post.title,
                'url': post.get_absolute_url(),
                'summary': post.excerpt or '',
                'category': post.category.name if post.category else None,
                'thumbnail': request.build_absolute_uri(post.thumbnail.url) if post.thumbnail else None,
                'created_at': post.created_at.strftime('%Y-%m-%d %H:%M:%S'),
            }
            for post in posts
        ]
    }
    
    return JsonResponse(data, json_dumps_params={'ensure_ascii': False})
