"""
Django admin configuration for accounting models.
"""

from django.contrib import admin
from .models import (
    Account,
    JournalEntry,
    JournalEntryLine,
    GeneralLedger,
    FiscalPeriod,
    AccountBalance
)


class JournalEntryLineInline(admin.TabularInline):
    """Inline admin for journal entry lines"""
    model = JournalEntryLine
    extra = 2
    fields = ('account', 'description', 'debit_amount', 'credit_amount', 'line_number')


@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    """Admin configuration for Account model"""
    list_display = ('code', 'name', 'account_type', 'is_active', 'get_balance')
    list_filter = ('account_type', 'is_active', 'is_system_account', 'subtype')
    search_fields = ('code', 'name', 'description')
    ordering = ('code',)
    readonly_fields = ('created_at', 'updated_at')
    
    def get_balance(self, obj):
        """Get current balance for the account"""
        from .services.accounting_service import AccountingService
        try:
            balance = AccountingService.get_account_balance(obj)
            return f"{balance:,.2f}"
        except Exception:
            return "N/A"
    get_balance.short_description = 'Balance'
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('code', 'name', 'account_type', 'subtype', 'description')
        }),
        ('Hierarchy', {
            'fields': ('parent_account',)
        }),
        ('Status', {
            'fields': ('is_active', 'is_system_account')
        }),
        ('Audit Information', {
            'fields': ('created_by', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(JournalEntry)
class JournalEntryAdmin(admin.ModelAdmin):
    """Admin configuration for JournalEntry model"""
    list_display = ('reference_number', 'transaction_date', 'status', 'branch', 'created_by', 'posted_at')
    list_filter = ('status', 'transaction_date', 'branch')
    search_fields = ('reference_number', 'description')
    readonly_fields = ('created_at', 'updated_at', 'posted_at')
    inlines = [JournalEntryLineInline]
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('reference_number', 'transaction_date', 'description', 'status')
        }),
        ('Branch and Integration', {
            'fields': ('branch', 'loan', 'expense')
        }),
        ('Reversal', {
            'fields': ('reverses',)
        }),
        ('Audit Information', {
            'fields': ('created_by', 'created_at', 'updated_at', 'posted_by', 'posted_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(JournalEntryLine)
class JournalEntryLineAdmin(admin.ModelAdmin):
    """Admin configuration for JournalEntryLine model"""
    list_display = ('journal_entry', 'account', 'debit_amount', 'credit_amount', 'line_number')
    list_filter = ('journal_entry__status',)
    search_fields = ('journal_entry__reference_number', 'account__code', 'account__name', 'description')
    ordering = ('journal_entry', 'line_number')


@admin.register(GeneralLedger)
class GeneralLedgerAdmin(admin.ModelAdmin):
    """Admin configuration for GeneralLedger model"""
    list_display = ('account', 'transaction_date', 'reference_number', 'debit_amount', 'credit_amount', 'balance', 'posted_at')
    list_filter = ('transaction_date', 'account__account_type', 'branch')
    search_fields = ('reference_number', 'account__code', 'account__name', 'description')
    readonly_fields = ('posted_at', 'posted_by')
    ordering = ('-transaction_date', '-posted_at')
    
    def has_add_permission(self, request):
        """Prevent manual creation of general ledger entries"""
        return False
    
    def has_change_permission(self, request, obj=None):
        """Prevent modification of general ledger entries"""
        return False
    
    def has_delete_permission(self, request, obj=None):
        """Prevent deletion of general ledger entries"""
        return False


@admin.register(FiscalPeriod)
class FiscalPeriodAdmin(admin.ModelAdmin):
    """Admin configuration for FiscalPeriod model"""
    list_display = ('name', 'period_type', 'start_date', 'end_date', 'status', 'closed_at')
    list_filter = ('period_type', 'status')
    search_fields = ('name',)
    readonly_fields = ('created_at', 'updated_at', 'closed_at')
    ordering = ('-start_date',)
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('name', 'period_type', 'start_date', 'end_date', 'status')
        }),
        ('Closing Information', {
            'fields': ('closed_by', 'closed_at'),
            'classes': ('collapse',)
        }),
        ('Balances (Cached)', {
            'fields': ('opening_balances', 'closing_balances'),
            'classes': ('collapse',)
        }),
        ('Audit Information', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(AccountBalance)
class AccountBalanceAdmin(admin.ModelAdmin):
    """Admin configuration for AccountBalance model"""
    list_display = ('account', 'branch', 'as_of_date', 'debit_balance', 'credit_balance', 'net_balance', 'updated_at')
    list_filter = ('as_of_date', 'branch')
    search_fields = ('account__code', 'account__name')
    readonly_fields = ('updated_at',)
    ordering = ('-as_of_date', 'account__code')
