"""
Admin configuration for Orders
"""
from django.contrib import admin
from .models import Order, OrderItem, OrderStatusHistory, CourierCompany


@admin.register(CourierCompany)
class CourierCompanyAdmin(admin.ModelAdmin):
    list_display = ('name', 'website', 'contact_number', 'is_active')
    search_fields = ('name', 'website')
    list_filter = ('is_active',)


class OrderItemInline(admin.TabularInline):
    """Inline for order items"""
    model = OrderItem
    extra = 0
    fields = ('product', 'product_name', 'quantity', 'total_price', 'courier_company', 'tracking_number', 'status')
    readonly_fields = ('product', 'product_name', 'product_sku', 'unit_price', 'quantity', 'total_price')
    can_delete = False


class OrderStatusHistoryInline(admin.TabularInline):
    """Inline for order status history"""
    model = OrderStatusHistory
    extra = 0
    readonly_fields = ('status', 'notes', 'changed_by', 'created_at')
    can_delete = False


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    """Order Admin"""
    
    list_display = (
        'order_code', 'user', 'status', 'total',
        'is_paid', 'created_at'
    )
    list_filter = ('status', 'is_paid', 'created_at', 'payment_method')
    search_fields = (
        'order_code', 'user__email', 'user__first_name',
        'user__last_name', 'tracking_number'
    )
    readonly_fields = (
        'order_code', 'created_at', 'updated_at',
        'subtotal', 'tax', 'shipping_cost', 'discount', 'total'
    )
    
    fieldsets = (
        ('Order Information', {
            'fields': ('order_code', 'user', 'status', 'created_at', 'updated_at')
        }),
        ('Addresses', {
            'fields': ('shipping_address', 'billing_address')
        }),
        ('Pricing', {
            'fields': ('subtotal', 'tax', 'shipping_cost', 'discount', 'total')
        }),
        ('Payment', {
            'fields': ('is_paid', 'payment_method', 'payment_id')
        }),
        ('Shipping', {
            'fields': ('courier_company', 'tracking_number', 'delivered_at')
        }),
        ('Notes', {
            'fields': ('customer_notes', 'staff_notes'),
            'classes': ('collapse',)
        }),
    )
    
    inlines = [OrderItemInline, OrderStatusHistoryInline]
    
    actions = ['mark_as_confirmed', 'mark_as_shipped', 'mark_as_delivered']
    
    def mark_as_confirmed(self, request, queryset):
        for order in queryset:
            order.status = Order.OrderStatus.CONFIRMED
            order.save()
            OrderStatusHistory.objects.create(
                order=order,
                status=Order.OrderStatus.CONFIRMED,
                changed_by=request.user,
                notes="Status updated via admin action"
            )
        self.message_user(request, f'{queryset.count()} orders marked as confirmed.')
    mark_as_confirmed.short_description = "Mark as Confirmed"
    
    def mark_as_shipped(self, request, queryset):
        for order in queryset:
            order.status = Order.OrderStatus.SHIPPED
            order.save()
            OrderStatusHistory.objects.create(
                order=order,
                status=Order.OrderStatus.SHIPPED,
                changed_by=request.user,
                notes="Status updated via admin action"
            )
        self.message_user(request, f'{queryset.count()} orders marked as shipped.')
    mark_as_shipped.short_description = "Mark as Shipped"
    
    def mark_as_delivered(self, request, queryset):
        from django.utils import timezone
        for order in queryset:
            order.status = Order.OrderStatus.DELIVERED
            order.delivered_at = timezone.now()
            order.save()
            OrderStatusHistory.objects.create(
                order=order,
                status=Order.OrderStatus.DELIVERED,
                changed_by=request.user,
                notes="Status updated via admin action"
            )
        self.message_user(request, f'{queryset.count()} orders marked as delivered.')
    mark_as_delivered.short_description = "Mark as Delivered"
