"""
Worktable Service - Django Admin Configuration.
"""
from django.contrib import admin
from django.utils.html import format_html

from .models import (
    TableDefinition,
    TableColumn,
    TableRecord,
    SavedFilter,
    CustomView,
    RecordAuditLog,
)


class TableColumnInline(admin.TabularInline):
    """Inline admin for table columns."""
    model = TableColumn
    fk_name = 'table'  # Specify which FK to use (not related_table)
    extra = 0
    fields = ['slug', 'name', 'field_type', 'is_required', 'is_searchable', 'order']
    readonly_fields = ['id']
    ordering = ['order']


@admin.register(TableDefinition)
class TableDefinitionAdmin(admin.ModelAdmin):
    """Admin for TableDefinition model."""
    list_display = [
        'name',
        'slug',
        'tenant',
        'is_active',
        'column_count',
        'record_count',
        'created_at',
    ]
    list_filter = ['is_active', 'enable_audit', 'enable_workflow', 'tenant']
    search_fields = ['name', 'slug', 'description']
    readonly_fields = ['id', 'created_at', 'updated_at', 'column_count', 'record_count']
    prepopulated_fields = {'slug': ('name',)}
    ordering = ['tenant', 'order', 'name']
    inlines = [TableColumnInline]
    
    fieldsets = (
        (None, {
            'fields': ('tenant', 'name', 'slug', 'description', 'icon')
        }),
        ('Settings', {
            'fields': ('settings', 'is_active', 'enable_audit', 'enable_workflow', 'order')
        }),
        ('Statistics', {
            'fields': ('column_count', 'record_count'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )
    
    def column_count(self, obj):
        return obj.columns.count()
    column_count.short_description = 'Columns'
    
    def record_count(self, obj):
        return obj.records.filter(is_deleted=False).count()
    record_count.short_description = 'Records'


@admin.register(TableColumn)
class TableColumnAdmin(admin.ModelAdmin):
    """Admin for TableColumn model."""
    list_display = [
        'name',
        'slug',
        'table',
        'field_type',
        'is_required',
        'is_searchable',
        'order',
    ]
    list_filter = ['field_type', 'is_required', 'is_searchable', 'table__tenant']
    search_fields = ['name', 'slug', 'table__name']
    readonly_fields = ['id', 'created_at', 'updated_at']
    ordering = ['table', 'order']
    
    fieldsets = (
        (None, {
            'fields': ('table', 'name', 'slug', 'field_type', 'config')
        }),
        ('Display Settings', {
            'fields': ('order', 'is_visible')
        }),
        ('Validation', {
            'fields': ('is_required', 'is_unique')
        }),
        ('Search & Filter', {
            'fields': ('is_searchable', 'is_sortable', 'is_filterable')
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(TableRecord)
class TableRecordAdmin(admin.ModelAdmin):
    """Admin for TableRecord model."""
    list_display = [
        'id',
        'table',
        'owner',
        'status',
        'version',
        'is_deleted',
        'created_at',
    ]
    list_filter = ['status', 'is_deleted', 'table', 'table__tenant']
    search_fields = ['id', 'owner__email']
    readonly_fields = ['id', 'version', 'created_at', 'updated_at', 'deleted_at']
    date_hierarchy = 'created_at'
    ordering = ['-created_at']
    
    fieldsets = (
        (None, {
            'fields': ('table', 'owner', 'status')
        }),
        ('Data', {
            'fields': ('data',)
        }),
        ('Versioning', {
            'fields': ('version', 'is_deleted', 'deleted_at'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(SavedFilter)
class SavedFilterAdmin(admin.ModelAdmin):
    """Admin for SavedFilter model."""
    list_display = ['name', 'table', 'user', 'is_default', 'is_shared', 'created_at']
    list_filter = ['is_default', 'is_shared', 'table__tenant']
    search_fields = ['name', 'table__name', 'user__email']
    readonly_fields = ['id', 'created_at']
    ordering = ['table', 'order', 'name']


@admin.register(CustomView)
class CustomViewAdmin(admin.ModelAdmin):
    """Admin for CustomView model."""
    list_display = ['name', 'table', 'user', 'is_default', 'is_shared', 'created_at']
    list_filter = ['is_default', 'is_shared', 'table__tenant']
    search_fields = ['name', 'table__name', 'user__email']
    readonly_fields = ['id', 'created_at']
    ordering = ['table', 'order', 'name']


@admin.register(RecordAuditLog)
class RecordAuditLogAdmin(admin.ModelAdmin):
    """Admin for RecordAuditLog model."""
    list_display = [
        'id',
        'table',
        'record_id',
        'user',
        'action',
        'ip_address',
        'created_at',
    ]
    list_filter = ['action', 'table', 'table__tenant']
    search_fields = ['record_id', 'user__email', 'ip_address']
    readonly_fields = [
        'id', 'table', 'record_id', 'user', 'action',
        'changes', 'metadata', 'ip_address', 'user_agent', 'created_at'
    ]
    date_hierarchy = 'created_at'
    ordering = ['-created_at']
    
    def has_add_permission(self, request):
        return False
    
    def has_change_permission(self, request, obj=None):
        return False
    
    def has_delete_permission(self, request, obj=None):
        # Allow superusers to delete old logs if needed
        return request.user.is_superuser
