from django.contrib import admin
from .models import BlogPost

@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
    """
    Advanced Django Admin customization for BlogPost CMS.
    """
    # 1. Columns shown in the blog list view
    list_display = ('title', 'author', 'status', 'is_featured', 'views_count', 'created_at')
    
    # 2. Filters on the right sidebar
    list_filter = ('status', 'is_featured', 'created_at', 'author')
    
    # 3. Search bar fields
    search_fields = ('title', 'content', 'excerpt', 'author__username', 'author__first_name', 'author__last_name')
    
    # 4. Auto-populate slug from title
    prepopulated_fields = {'slug': ('title',)}
    
    # 5. Breadcrumb date navigation at the top
    date_hierarchy = 'created_at'
    
    # 6. Read-only metadata fields
    readonly_fields = ('views_count', 'created_at', 'updated_at')
    
    # 7. Form layout grouping
    fieldsets = (
        ("Post Details", {
            "fields": ("title", "slug", "author", "content", "excerpt", "featured_image")
        }),
        ("Status & Feature Settings", {
            "fields": ("status", "is_featured")
        }),
        ("SEO Meta Tags", {
            "fields": ("meta_title", "meta_description", "meta_keywords"),
            "classes": ("collapse",), # Collapsible fieldset
            "description": "Customize meta information for search engine optimization."
        }),
        ("System Timestamps", {
            "fields": ("views_count", "created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    # 8. Custom Bulk Actions
    actions = ['make_published', 'make_draft']

    @admin.action(description="Mark selected posts as Published")
    def make_published(self, request, queryset):
        updated = queryset.update(status='PUBLISHED')
        self.message_user(request, f"{updated} blog posts successfully marked as Published.")

    @admin.action(description="Mark selected posts as Draft")
    def make_draft(self, request, queryset):
        updated = queryset.update(status='DRAFT')
        self.message_user(request, f"{updated} blog posts successfully marked as Draft.")

