from django.contrib import admin
from .models import Transfer, TransferItem, TransferComment, TransferEvent


class TransferItemInline(admin.TabularInline):
    """Inline admin for transfer items"""
    model = TransferItem
    extra = 0
    readonly_fields = ['variance', 'has_discrepancy', 'created_at', 'updated_at']
    fields = [
        'inventory_item', 'quantity', 'received_quantity', 
        'condition', 'status', 'notes', 'received_notes'
    ]


class TransferCommentInline(admin.TabularInline):
    """Inline admin for transfer comments"""
    model = TransferComment
    extra = 0
    readonly_fields = ['created_at', 'updated_at']
    fields = ['user', 'text', 'is_internal', 'created_at']


class TransferEventInline(admin.TabularInline):
    """Inline admin for transfer events"""
    model = TransferEvent
    extra = 0
    readonly_fields = ['created_at']
    fields = ['event_type', 'user', 'notes', 'created_at']
    can_delete = False


@admin.register(Transfer)
class TransferAdmin(admin.ModelAdmin):
    """Admin interface for transfers"""
    
    list_display = [
        'transfer_number', 'business', 'source_location', 
        'destination_location', 'status', 'priority', 
        'requested_by', 'total_items_count', 'created_at'
    ]
    
    list_filter = [
        'status', 'priority', 'business', 
        'source_location', 'destination_location',
        'has_discrepancies', 'created_at'
    ]
    
    search_fields = [
        'transfer_number', 'notes', 'tracking_number',
        'requested_by__username', 'requested_by__email'
    ]
    
    readonly_fields = [
        'id', 'transfer_number', 'requested_date', 'approved_date',
        'shipped_date', 'delivered_date', 'received_date',
        'total_items_count', 'total_value', 'duration_days',
        'is_overdue', 'created_at', 'updated_at'
    ]
    
    fieldsets = (
        ('Basic Information', {
            'fields': (
                'id', 'transfer_number', 'business', 
                'source_location', 'destination_location'
            )
        }),
        ('Status & Priority', {
            'fields': ('status', 'priority')
        }),
        ('Personnel', {
            'fields': (
                'requested_by', 'approved_by', 'received_by', 'rejected_by'
            )
        }),
        ('Timeline', {
            'fields': (
                'requested_date', 'approved_date', 'shipped_date',
                'expected_delivery_date', 'delivered_date', 'received_date'
            )
        }),
        ('Shipping Information', {
            'fields': (
                'carrier_name', 'tracking_number', 'shipping_method',
                'estimated_cost', 'actual_cost'
            )
        }),
        ('Receipt Information', {
            'fields': (
                'has_discrepancies', 'discrepancy_report'
            )
        }),
        ('Rejection Information', {
            'fields': (
                'rejected_at', 'rejection_reason'
            ),
            'classes': ('collapse',)
        }),
        ('Notes', {
            'fields': ('notes', 'internal_notes', 'attachments')
        }),
        ('Computed Fields', {
            'fields': (
                'total_items_count', 'total_value', 
                'duration_days', 'is_overdue'
            ),
            'classes': ('collapse',)
        }),
        ('Metadata', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )
    
    inlines = [TransferItemInline, TransferCommentInline, TransferEventInline]
    
    date_hierarchy = 'created_at'
    
    def get_queryset(self, request):
        """Optimize queryset"""
        return super().get_queryset(request).select_related(
            'business', 'source_location', 'destination_location',
            'requested_by', 'approved_by', 'received_by', 'rejected_by'
        )


@admin.register(TransferItem)
class TransferItemAdmin(admin.ModelAdmin):
    """Admin interface for transfer items"""
    
    list_display = [
        'transfer', 'inventory_item', 'quantity', 
        'received_quantity', 'condition', 'status',
        'has_discrepancy'
    ]
    
    list_filter = ['condition', 'status', 'transfer__status']
    
    search_fields = [
        'transfer__transfer_number', 
        'inventory_item__asset_id',
        'inventory_item__serial_number'
    ]
    
    readonly_fields = ['variance', 'has_discrepancy', 'created_at', 'updated_at']
    
    fieldsets = (
        ('Transfer Item', {
            'fields': ('transfer', 'inventory_item')
        }),
        ('Quantities', {
            'fields': ('quantity', 'received_quantity', 'variance')
        }),
        ('Status', {
            'fields': ('condition', 'status', 'has_discrepancy')
        }),
        ('Notes', {
            'fields': ('notes', 'received_notes')
        }),
        ('Metadata', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(TransferComment)
class TransferCommentAdmin(admin.ModelAdmin):
    """Admin interface for transfer comments"""
    
    list_display = ['transfer', 'user', 'text_preview', 'is_internal', 'created_at']
    
    list_filter = ['is_internal', 'created_at']
    
    search_fields = ['transfer__transfer_number', 'user__username', 'text']
    
    readonly_fields = ['created_at', 'updated_at']
    
    def text_preview(self, obj):
        """Show preview of comment text"""
        return obj.text[:50] + '...' if len(obj.text) > 50 else obj.text
    text_preview.short_description = 'Comment'


@admin.register(TransferEvent)
class TransferEventAdmin(admin.ModelAdmin):
    """Admin interface for transfer events"""
    
    list_display = ['transfer', 'event_type', 'user', 'notes_preview', 'created_at']
    
    list_filter = ['event_type', 'created_at']
    
    search_fields = ['transfer__transfer_number', 'notes']
    
    readonly_fields = ['created_at']
    
    def notes_preview(self, obj):
        """Show preview of event notes"""
        return obj.notes[:50] + '...' if len(obj.notes) > 50 else obj.notes
    notes_preview.short_description = 'Notes'
    
    def has_add_permission(self, request):
        """Prevent manual creation of events"""
        return False
    
    def has_delete_permission(self, request, obj=None):
        """Prevent deletion of events (audit trail)"""
        return False