from django.contrib import admin

# Register your models here.

from shop_management.models.data.expense import Expense, ExpenseCategory
from shop_management.models.data.shop import Shop
from shop_management.models.data.supplier import Supplier
from shop_management.models.data.customer import Customer
from shop_management.models.data.product import Category, Product, ProductPrice
from shop_management.models.data.utils import Unit, Currency, ExchangeRate, PaymentStatus
from shop_management.models.data.shop_account import Account
from shop_management.models.data.account_transaction import AccountTransaction
from shop_management.models.data.account_transfer import AccountTransfer
from shop_management.models.data.purchase import Purchase, PurchaseItem
from shop_management.models.data.purchase_payment import PurchasePayment
from shop_management.models.data.sale import Sale, SaleItem
from shop_management.models.data.sale_payment import SalePayment
from shop_management.models.data.sale_return import SaleReturn, SaleReturnItem
from shop_management.models.data.purchase_return import PurchaseReturn, PurchaseReturnItem
from shop_management.models.data.stock import Stock
from shop_management.models.data.stock_transfer import StockTransfer
from shop_management.models.data.advance import Advance
from shop_management.models.data.payroll import Payroll
from shop_management.models.data.employee import Employee
from shop_management.models.data.quotation import Quotation, QuotationItem
from shop_management.models.data.daily_diary import DailyDiaryEntry, DailyDiaryLog
from shop_management.models.data.organization import CompanySetting, Warehouse
from shop_management.models.data.inventory import InventoryBatch, StockBalance, StockMovement
from shop_management.models.data.stock_adjustment import StockAdjustment, StockAdjustmentItem


admin.site.register(Shop)
admin.site.register(Supplier)
admin.site.register(Customer)
admin.site.register(Product)
admin.site.register(ProductPrice)
admin.site.register(Category)
admin.site.register(Unit)
admin.site.register(Currency)
admin.site.register(ExchangeRate)
admin.site.register(Purchase)
admin.site.register(PurchaseItem)
admin.site.register(PurchasePayment)
admin.site.register(Sale)
admin.site.register(SaleItem)
admin.site.register(SalePayment)
admin.site.register(SaleReturn)
admin.site.register(SaleReturnItem)
admin.site.register(PurchaseReturn)
admin.site.register(PurchaseReturnItem)
admin.site.register(Stock)
admin.site.register(StockTransfer)
admin.site.register(Employee)
admin.site.register(Quotation)
admin.site.register(QuotationItem)
admin.site.register(DailyDiaryEntry)
admin.site.register(DailyDiaryLog)
admin.site.register(Payroll)
admin.site.register(Advance)
admin.site.register(ExpenseCategory)
admin.site.register(Expense)
admin.site.register(Account)
admin.site.register(AccountTransaction)
admin.site.register(AccountTransfer)
admin.site.register(CompanySetting)
admin.site.register(Warehouse)
admin.site.register(InventoryBatch)


@admin.register(StockBalance)
class StockBalanceAdmin(admin.ModelAdmin):
    list_display = ("warehouse", "product", "batch", "quantity", "average_cost", "cost_currency")
    list_filter = ("warehouse", "cost_currency")
    search_fields = ("product__name", "batch__batch_number")

    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):
        return False


@admin.register(StockMovement)
class StockMovementAdmin(admin.ModelAdmin):
    list_display = ("movement_date", "movement_type", "warehouse", "product", "batch", "quantity_in", "quantity_out")
    list_filter = ("movement_type", "warehouse", "currency")
    search_fields = ("product__name", "batch__batch_number", "reference_type", "reference_id")

    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):
        return False


class StockAdjustmentItemInline(admin.TabularInline):
    model = StockAdjustmentItem
    extra = 0

    def has_add_permission(self, request, obj=None):
        return obj is None or obj.status == StockAdjustment.Status.DRAFT

    def has_change_permission(self, request, obj=None):
        return obj is None or obj.status == StockAdjustment.Status.DRAFT

    def has_delete_permission(self, request, obj=None):
        return obj is None or obj.status == StockAdjustment.Status.DRAFT


@admin.register(StockAdjustment)
class StockAdjustmentAdmin(admin.ModelAdmin):
    list_display = ("adjustment_number", "warehouse", "adjustment_date", "reason", "status")
    list_filter = ("status", "warehouse", "adjustment_date")
    search_fields = ("adjustment_number", "reason", "notes")
    inlines = (StockAdjustmentItemInline,)

    def get_readonly_fields(self, request, obj=None):
        if obj and obj.status != StockAdjustment.Status.DRAFT:
            return tuple(field.name for field in self.model._meta.fields)
        return ("adjustment_number", "status", "posted_at", "posted_by", "voided_at", "voided_by", "void_reason")
