"""
Inventory Admin — تنظیمات پنل مدیریت جنگو.
"""
from django.contrib import admin

from .infrastructure.persistence.models import (
    ItemTypeModel, ItemGroupModel, UnitOfMeasureModel,
    ItemModel, ItemAttributeModel, ItemUOMModel,
    WarehouseModel, StorageLocationModel, ItemWarehouseModel,
)
from .infrastructure.persistence.models_extended import (
    StockStatusModel, BatchModel, SerialNumberModel, SerialNumberHistoryModel,
    StockLedgerEntryModel, StockBalanceModel,
    CostingMethodModel, ItemCostingModel, CostLayerModel, FinancialPostingModel,
    StockReservationModel, StockAllocationModel,
    PhysicalInventoryModel, PhysicalInventoryLineModel, CycleCountScheduleModel,
    InspectionLotModel, InspectionResultModel, QualityActionModel,
    StockMovementSummaryModel, StockAgingBucketModel,
)


# ═══════════════════════════════════════════════════
# 1️⃣  Master Data
# ═══════════════════════════════════════════════════

@admin.register(ItemTypeModel)
class ItemTypeAdmin(admin.ModelAdmin):
    list_display = ("type_code", "type_name", "is_active", "tenant")
    list_filter = ("is_active", "tenant")
    search_fields = ("type_code", "type_name")


@admin.register(ItemGroupModel)
class ItemGroupAdmin(admin.ModelAdmin):
    list_display = ("group_code", "group_name", "parent_group", "is_active", "tenant")
    list_filter = ("is_active", "tenant")
    search_fields = ("group_code", "group_name")


@admin.register(UnitOfMeasureModel)
class UnitOfMeasureAdmin(admin.ModelAdmin):
    list_display = ("uom_code", "uom_name", "uom_type", "is_active", "tenant")
    list_filter = ("uom_type", "is_active", "tenant")
    search_fields = ("uom_code", "uom_name")


class ItemAttributeInline(admin.TabularInline):
    model = ItemAttributeModel
    extra = 0


class ItemUOMInline(admin.TabularInline):
    model = ItemUOMModel
    extra = 0


@admin.register(ItemModel)
class ItemAdmin(admin.ModelAdmin):
    list_display = (
        "item_code", "item_name", "item_type", "item_group",
        "item_status", "tenant",
    )
    list_filter = ("item_status", "item_type", "item_group", "tenant")
    search_fields = ("item_code", "item_name", "item_name_local")
    inlines = [ItemAttributeInline, ItemUOMInline]
    fieldsets = (
        ("اطلاعات پایه", {
            "fields": (
                "tenant", "item_code", "item_name", "item_name_local",
                "item_type", "item_group", "item_description",
            )
        }),
        ("واحد اندازه‌گیری", {
            "fields": ("base_uom",)
        }),
        ("طبقه‌بندی", {
            "fields": ("abc_classification",)
        }),
        ("کنترل", {
            "fields": (
                "is_batch_managed", "is_serial_managed",
                "is_expiry_managed", "shelf_life_days",
                "lead_time_days",
            )
        }),
        ("نوع کالا", {
            "fields": (
                "is_purchasable", "is_saleable",
                "is_stockable", "is_producible",
            )
        }),
        ("وضعیت", {
            "fields": ("item_status",)
        }),
    )


# ═══════════════════════════════════════════════════
# 2️⃣  Warehouse & Location
# ═══════════════════════════════════════════════════

class StorageLocationInline(admin.TabularInline):
    model = StorageLocationModel
    extra = 0


@admin.register(WarehouseModel)
class WarehouseAdmin(admin.ModelAdmin):
    list_display = (
        "warehouse_code", "warehouse_name", "warehouse_type",
        "is_active", "tenant",
    )
    list_filter = ("warehouse_type", "is_active", "tenant")
    search_fields = ("warehouse_code", "warehouse_name")
    inlines = [StorageLocationInline]


@admin.register(StorageLocationModel)
class StorageLocationAdmin(admin.ModelAdmin):
    list_display = ("location_code", "location_name", "warehouse", "location_type", "is_active")
    list_filter = ("location_type", "is_active", "warehouse")
    search_fields = ("location_code", "location_name")


@admin.register(ItemWarehouseModel)
class ItemWarehouseAdmin(admin.ModelAdmin):
    list_display = ("item", "warehouse", "is_active", "tenant")
    list_filter = ("is_active", "tenant")


# ═══════════════════════════════════════════════════
# 3️⃣  Stock
# ═══════════════════════════════════════════════════

@admin.register(StockStatusModel)
class StockStatusAdmin(admin.ModelAdmin):
    list_display = ("status_code", "status_name", "status_type", "is_active")
    list_filter = ("status_type", "is_active", "tenant")


@admin.register(StockLedgerEntryModel)
class StockLedgerEntryAdmin(admin.ModelAdmin):
    list_display = (
        "item", "warehouse", "transaction_type",
        "quantity", "posting_date", "tenant",
    )
    list_filter = ("transaction_type", "posting_date", "tenant")
    search_fields = ("document_number",)
    date_hierarchy = "posting_date"
    readonly_fields = (
        "id", "created_at",
    )


@admin.register(StockBalanceModel)
class StockBalanceAdmin(admin.ModelAdmin):
    list_display = (
        "item", "warehouse", "quantity_on_hand",
        "quantity_reserved", "quantity_available",
    )
    list_filter = ("warehouse", "tenant")
    search_fields = ("item__item_code", "item__item_name")


# ═══════════════════════════════════════════════════
# 4️⃣  Batch & Serial
# ═══════════════════════════════════════════════════

@admin.register(BatchModel)
class BatchAdmin(admin.ModelAdmin):
    list_display = (
        "batch_number", "item", "batch_status",
        "manufacturing_date", "expiry_date", "tenant",
    )
    list_filter = ("batch_status", "quality_status", "tenant")
    search_fields = ("batch_number",)


@admin.register(SerialNumberModel)
class SerialNumberAdmin(admin.ModelAdmin):
    list_display = (
        "serial_no", "item", "serial_status",
        "current_warehouse", "tenant",
    )
    list_filter = ("serial_status", "quality_status", "tenant")
    search_fields = ("serial_no", "supplier_serial_number")


@admin.register(SerialNumberHistoryModel)
class SerialNumberHistoryAdmin(admin.ModelAdmin):
    list_display = ("serial_number", "transaction_type", "transaction_date")
    list_filter = ("transaction_type",)
    date_hierarchy = "transaction_date"


# ═══════════════════════════════════════════════════
# 5️⃣  Costing
# ═══════════════════════════════════════════════════

@admin.register(CostingMethodModel)
class CostingMethodAdmin(admin.ModelAdmin):
    list_display = ("method_code", "method_name", "is_active")
    list_filter = ("is_active", "tenant")


@admin.register(ItemCostingModel)
class ItemCostingAdmin(admin.ModelAdmin):
    list_display = ("item", "costing_method", "moving_average_cost", "standard_cost")
    list_filter = ("costing_method", "tenant")


@admin.register(CostLayerModel)
class CostLayerAdmin(admin.ModelAdmin):
    list_display = ("item", "warehouse", "receipt_date", "remaining_quantity", "unit_cost")
    list_filter = ("warehouse", "tenant")
    date_hierarchy = "receipt_date"


@admin.register(FinancialPostingModel)
class FinancialPostingAdmin(admin.ModelAdmin):
    list_display = ("posting_status", "posting_date", "amount", "currency_code")
    list_filter = ("posting_status", "tenant")
    date_hierarchy = "posting_date"


# ═══════════════════════════════════════════════════
# 6️⃣  Reservation
# ═══════════════════════════════════════════════════

@admin.register(StockReservationModel)
class StockReservationAdmin(admin.ModelAdmin):
    list_display = (
        "reservation_number", "item", "warehouse",
        "reserved_quantity", "reservation_status", "reservation_date",
    )
    list_filter = ("reservation_status", "tenant")
    search_fields = ("reservation_number",)


@admin.register(StockAllocationModel)
class StockAllocationAdmin(admin.ModelAdmin):
    list_display = ("item", "warehouse", "allocated_quantity", "allocation_status")
    list_filter = ("allocation_status", "tenant")


# ═══════════════════════════════════════════════════
# 7️⃣  Physical Inventory
# ═══════════════════════════════════════════════════

class PhysicalInventoryLineInline(admin.TabularInline):
    model = PhysicalInventoryLineModel
    extra = 0


@admin.register(PhysicalInventoryModel)
class PhysicalInventoryAdmin(admin.ModelAdmin):
    list_display = (
        "inventory_number", "inventory_type", "inventory_status",
        "warehouse", "inventory_date",
    )
    list_filter = ("inventory_type", "inventory_status", "tenant")
    search_fields = ("inventory_number",)
    inlines = [PhysicalInventoryLineInline]


@admin.register(CycleCountScheduleModel)
class CycleCountScheduleAdmin(admin.ModelAdmin):
    list_display = ("schedule_name", "warehouse", "count_frequency_days", "is_active")
    list_filter = ("is_active", "tenant")


# ═══════════════════════════════════════════════════
# 8️⃣  Quality
# ═══════════════════════════════════════════════════

class InspectionResultInline(admin.TabularInline):
    model = InspectionResultModel
    extra = 0


class QualityActionInline(admin.TabularInline):
    model = QualityActionModel
    extra = 0


@admin.register(InspectionLotModel)
class InspectionLotAdmin(admin.ModelAdmin):
    list_display = (
        "inspection_lot_number", "item", "inspection_type",
        "inspection_status", "quality_decision",
    )
    list_filter = ("inspection_type", "inspection_status", "quality_decision", "tenant")
    search_fields = ("inspection_lot_number",)
    inlines = [InspectionResultInline, QualityActionInline]


# ═══════════════════════════════════════════════════
# 9️⃣  Reporting
# ═══════════════════════════════════════════════════

@admin.register(StockMovementSummaryModel)
class StockMovementSummaryAdmin(admin.ModelAdmin):
    list_display = (
        "item", "warehouse", "summary_date", "transaction_type",
        "total_in_quantity", "total_out_quantity", "net_quantity",
    )
    list_filter = ("warehouse", "tenant")


@admin.register(StockAgingBucketModel)
class StockAgingBucketAdmin(admin.ModelAdmin):
    list_display = ("item", "warehouse", "age_in_days", "aging_category", "quantity", "value")
    list_filter = ("warehouse", "tenant")
