from django.contrib import admin
from django.utils.html import format_html

from .models import BoardMember, Category, Document, DownloadLog


@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ("name", "slug", "order", "document_count")
    prepopulated_fields = {"slug": ("name",)}
    ordering = ("order", "name")

    @admin.display(description="documents")
    def document_count(self, obj):
        return obj.documents.count()


@admin.register(Document)
class DocumentAdmin(admin.ModelAdmin):
    """Upload and categorise documents.

    Deliberately shaped so adding a document is as quick as attaching one to an
    email: title, category, file — everything else is optional or automatic.
    """

    list_display = ("title", "category", "published", "published_date", "has_file", "uploaded_by")
    list_filter = ("published", "category")
    list_editable = ("category", "published")
    search_fields = ("title", "summary")
    date_hierarchy = "published_date"
    list_per_page = 40
    readonly_fields = ("uploaded_by", "created_at", "updated_at", "wp_id")

    fieldsets = (
        (None, {
            "fields": ("title", "collection", "category", "published_date", "published"),
            "description": "Title, category and the file are all you need — the rest is optional.",
        }),
        ("File", {"fields": ("file",)}),
        ("Optional", {"fields": ("summary",), "classes": ("collapse",)}),
        ("Record", {
            "fields": ("uploaded_by", "wp_id", "created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    @admin.display(boolean=True, description="file")
    def has_file(self, obj):
        return bool(obj.file)

    def save_model(self, request, obj, form, change):
        if not obj.uploaded_by_id:
            obj.uploaded_by = request.user
        super().save_model(request, obj, form, change)


@admin.register(BoardMember)
class BoardMemberAdmin(admin.ModelAdmin):
    list_display = ("name", "title", "order", "active")
    list_editable = ("title", "order", "active")
    list_filter = ("active",)
    search_fields = ("name", "title")
    fieldsets = (
        (None, {"fields": ("name", "title", "order", "active")}),
        ("Details", {"fields": ("bio", "photo")}),
        ("Staff reference only", {
            "fields": ("contact_email",),
            "description": "Never shown on the site — for your reference only.",
        }),
    )

    @admin.display(description="")
    def review_note(self, obj):
        return format_html("<em>Imported members start inactive until reviewed.</em>")


@admin.register(DownloadLog)
class DownloadLogAdmin(admin.ModelAdmin):
    """Read-only record of who downloaded what."""

    list_display = ("downloaded_at", "user", "document", "which", "ip")
    list_filter = ("downloaded_at",)
    search_fields = ("user__username", "document__title", "ip")
    readonly_fields = ("user", "document", "which", "ip", "downloaded_at")

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False
